Clojure:如何将字符串转换为长整型?

4

假设您有字符串“100.0”,如何将其转换为长整型。

5个回答

10

字符串"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

请注意,您不能直接将 Long/valueOf 传递给 map 等函数。(map Long/valueOf ["1" "2"]) 会返回语法错误,但 (map #(Long/valueOf %) ["1" "2"]) 可以正常工作。 - iGEL

2
user=> (long (Float/valueOf "100.0"))
100

user=> (type (long (Float/valueOf "100.0")))
java.lang.Long

2
您可以使用 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

2
如果您只想使用clojure.core,那么bigdec可以有效地强制转换为Number类型,然后再将其强制转换为Long类型。
例如,无论您的字符串是长整型还是双精度浮点型——
user=> (long (bigdec "100"))
100

或者

user=> (long (bigdec "100.0"))
100

2
user=> (-> "100.0" Double/parseDouble long)
100

或者

user=> (->> "100.0" (re-find #"\d+") Long/parseLong)
100

Double/parseDoubleLong/parseLong都返回原始数值类型,而*/valueOf则返回一个装箱对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接