我一直想把这个问题想象一下.
(defn is-decimal [astr] (if (. astr (indexOf (int \.))) (Double/parseDouble astr) (Integer/parseInt astr)))
这就是我写的功能.is-decimal
或者传递诸如"2.5"或"5"之类的东西或类似的东西,但它总是使用if
第二个参数,而不是第三个参数.我(. astr (indexOf (int \.)))
在REPL中测试过,它看起来工作正常,它在失败时返回-1,而在它失败时返回1.我相信这可能是问题所在.-1在Clojure中并不意味着错误.谁能想到解决这个问题的方法?
提前致谢.
编辑:谢谢你的帮助.在我写完之后,我有了一个主意.我编写了一个检查1和-1的谓词函数.正是我需要的.醒来后我不应该直接编码:
如果要测试字符串是否包含字符,可以使用正则表达式:
(re-find #"\." astr)
要么:
(some #(= \. %) astr)
要么:
(contains? (into #{} astr) \.)
或者你可以使用includes?
从clojure.contrib.seq-utils的它做这件事的.
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
.
未经测试:
(if (> 0 (. astr (indexOf (int \.))))