2012-05-25 182 views

回答

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 
+0

@octopusgrabbus - 感谢您的帮助。 – BLUEPIXY

+11

你可能不应该在现实生活中使用它。从文档中,它可以执行任意代码https://clojuredocs.org/clojure.core/read-string这是一个巨大的安全漏洞。我认为'bigdec'是一个更好的解决方案。 –

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结合的方式,因为需要一个临时的地方来存储读取字符串返回值,因此它可以被测试作为一个数字。如果它是一个数字,则返回;否则返回零。

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" 
+1

试试这个(阅读字符串“1.01M”) – BLUEPIXY

29

有非常方便的Clojure的功能从任何转换为​​字符串,并从类似的东西了一些为BigDecimal:

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

我想这是clojure规范的方式。

+3

这应该是被接受的答案。 – nha

相关问题