假设您有字符串“100.0”,如何将其转换为长整型。
字符串"100.0"是Double的字符串表示形式,因此如果您尝试将其解析为long,您将会得到一个异常。
请使用Java原始包装器的方法。
(let [s "100.0"] (Double/valueOf s))
> 100.0
(let [s "100.0"] (class (Double/valueOf s)))
> java.lang.Double
或者,如果您的字符串是一个长整型数字,您可以使用java.lang.Long类中的方法进行解析:
(let [s "100"] (Long/valueOf s))
> 100
(let [s "100"] (class (Long/valueOf s)))
> java.lang.Long
user=> (long (Float/valueOf "100.0"))
100
user=> (type (long (Float/valueOf "100.0")))
java.lang.Long
java.text.NumberFormat
自动获取正确的 Long 或 Double 类型。user=> (.parse (java.text.NumberFormat/getInstance) "100.0")
100
user=> (type *1)
java.lang.Long
user=> (.parse (java.text.NumberFormat/getInstance) "100.5")
100.5
user=> (type *1)
java.lang.Double
clojure.core
,那么bigdec
可以有效地强制转换为Number
类型,然后再将其强制转换为Long
类型。user=> (long (bigdec "100"))
100
或者
user=> (long (bigdec "100.0"))
100
user=> (-> "100.0" Double/parseDouble long)
100
或者
user=> (->> "100.0" (re-find #"\d+") Long/parseLong)
100
Double/parseDouble
和Long/parseLong
都返回原始数值类型,而*/valueOf
则返回一个装箱对象。
Long/valueOf
传递给map
等函数。(map Long/valueOf ["1" "2"])
会返回语法错误,但(map #(Long/valueOf %) ["1" "2"])
可以正常工作。 - iGEL