如何编写函数将十进制数字串转换为十进制数,将十进制数转换为字符串?
答案 0 :(得分:32)
有很方便的clojure函数可以从任何东西转换为字符串,从类似于数字的东西转换为BigDecimal:
user=> (bigdec "1234")
1234M
user=> (str 1234M)
"1234"
我猜这是clojure规范方式。
答案 1 :(得分:2)
此示例将数字字符串转换为数字。
(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
答案 2 :(得分: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绑定的方法,因为需要一个临时位置来存储读取字符串返回值,因此可以将其作为数字进行测试。如果是数字,则返回;否则返回nil。
答案 3 :(得分:1)
请注意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"