16

如何编写一个函数来将十进制数字符串转换为十进制数并将十进制数转换为字符串?

4

4 回答 4

38

有非常方便的 clojure 函数可以将任何内容转换为字符串,以及将类似数字的内容转换为 BigDecimal:

user=> (bigdec "1234")
1234M
user=> (str 1234M)
"1234"

我想这是clojure规范的方式。

于 2012-05-25T15:13:03.713 回答
4

此示例将数字字符串转换为数字。

(defn String->Number [str]
  (let [n (read-string str)]
       (if (number? n) n nil)))

样本:

user=> (String->Number "4.5")
4.5
user=> (str 4.5)
"4.5"
user=> (String->Number "abc")
nil
于 2012-05-25T10:50:00.830 回答
2

请注意,这read-string会给您一个浮点数,而不是小数:

user=> (.getClass (read-string "1.01"))
java.lang.Double

你得到的数字打印出来就像你想要的一样,但事实并非如此。

user=> (new BigDecimal (read-string "1.01"))
1.0100000000000000088817841970012523233890533447265625M

您可以java.math.BigDecimal改用并避免浮点并发症:

user=> (new BigDecimal "1.01")
1.01M
user=> (.toString (new BigDecimal "1.01"))
"1.01"
于 2012-05-25T13:28:47.600 回答
1

根据您的问题,您似乎需要一个切换功能,即可以读取数字并转换为字符串,还可以读取字符串并返回数字,如果字符串包含数字,例如 123.0 或“123.0” .

这是一个例子:

(defn cvt-str-num [val]
    (if (try 
            (number? val)
            (catch Exception e (str "Invalid number: " (.getMessage e))))
        (str val)
        (let [n-val (read-string val)]
            (if (number? n-val)
                n-val
                nil))))

我看不到绕过 n-val 的 let 绑定的方法,因为需要一个临时位置来存储读取字符串返回值,因此可以将其作为数字进行测试。如果是数字则返回;否则返回零。

于 2012-05-25T13:10:22.367 回答