7

一段时间以来,我一直试图弄清楚这个。

(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 的谓词函数。正是我需要的。我不应该在醒来后直接编码:\

4

3 回答 3

10

如果要测试字符串是否包含字符,可以使用正则表达式:

(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-numberstring-to-number.

于 2009-02-06T19:16:16.437 回答
6

未经测试:

(if (> 0 (. astr (indexOf (int \.))))
于 2009-02-05T14:26:40.343 回答
2

好吧,如果它确实返回 -1 如果它失败然后检查 -1 并返回 false 如果它是

于 2009-02-05T14:25:30.127 回答