Clojure: Как преобразовать строку в длинную?

Скажем, у вас есть строка "100.0". Как преобразовать ее в длинный.

5 ответов

Строка "100.0" представляет собой строковое представление ******, поэтому, если вы попытаетесь разобрать его до конца, вы получите исключение.

Используйте методы из примитивных примитивов Java.

(let [s "100.0"] (******/valueOf s))
> 100.0
(let [s "100.0"] (class (******/valueOf s)))
> java.lang.******

Или, если ваша строка длинна, вы можете проанализировать ее с помощью методов из класса java.lang.Long:

(let [s "100"] (Long/valueOf s))
> 100
(let [s "100"] (class (Long/valueOf s)))
> java.lang.Long


Вы можете автоматически получить правильный длинный или двойной тип с помощью java.text.NumberFormat

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.******


user=> (-> "100.0" ******/parse****** long)
100

или

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

Оба ******/parse****** и Long/parseLong возвращают примитивные числовые значения, тогда как */valueOf возвращает объект в штучной упаковке.


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

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


Если вы хотите использовать только clojure.core, bigdec будет эффективно принуждать к типу Number который вы затем можете принудить к Long.

например, является ли ваша строка длинной или двойной -

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

или

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

licensed under cc by-sa 3.0 with attribution.