我一直想把这个问题弄清楚一段时间。
(defn is-decimal [astr]
(if (. astr (indexOf (int \.)))
(Double/parseDouble astr)
(Integer/parseInt astr)))
这是我写的功能。 is-decimal
要么传递诸如“2.5”或“5”之类的东西,要么传递类似的东西,但它总是使用if
的第二个参数,而不是第三个参数。我在REPL中测试了(. astr (indexOf (int \.)))
,它看起来工作正常,它失败时返回-1,而当它失败时返回1。我相信这可能是问题所在。 -1在Clojure中并不意味着错误。谁能想到解决这个问题的方法呢?
提前致谢。
编辑:谢谢你的帮助。在我写完之后,我有了一个主意。我编写了一个检查1和-1的谓词函数。正是我需要的。醒来后我不应该直接编码:\答案 0 :(得分:10)
如果要测试字符串是否包含字符,可以使用正则表达式:
(re-find #"\." astr)
或者:
(some #(= \. %) astr)
或者:
(contains? (into #{} astr) \.)
或者您可以使用clojure.contrib.seq-utils中的includes?
来执行此操作。
Clojure已经有一个知道如何区分整数和双精度的读者,所以如果你确定你的字符串中只有数字,你可以使用它。 (但要小心,这会读取任何内容,而不仅仅是数字。这有潜在的危险。如果你的字符串有可能不是数字,请不要使用它。)
注意,Clojure还处理一个整数太大而不适合本地int
而没有溢出的情况。如果要解析整数,可能需要查看bigint函数而不是parseInt
。
user> (class (read-string "2.5"))
java.lang.Double
user> (class (read-string "2"))
java.lang.Integer
user> (class (read-string "2000000000000"))
java.math.BigInteger
如果你的函数是谓词,那么在Clojure中将它命名为decimal?
而不是is-decimal
是很常见的。您的函数实际上更像是一个数字解析器,所以我个人称之为parse-number
或string-to-number
。
答案 1 :(得分:6)
未测试:
(if (> 0 (. astr (indexOf (int \.))))
答案 2 :(得分:2)
如果失败则返回-1,然后检查-1,如果
则返回false