Как мне начать писать функцию для преобразования десятичной строки в десятичный и десятичный числа в строку?
Как преобразовать числовую строку в число (десятичный) и число в строку
Ответ 1
Этот пример преобразует числовую строку в число.
(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
Есть очень удобные функции clojure для преобразования из чего-либо в строку и из чего-то, похожего на число в BigDecimal:
user=> (bigdec "1234")
1234M
user=> (str 1234M)
"1234"
Я предполагаю, что это clojure канонический путь.
Ответ 3
Из вашего вопроса вы, похоже, хотите функцию переключения, то есть такую, которая может читать число и преобразовывать в строку, а также читать в строке и возвращать число, если строка содержит числовые цифры, например 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))))
Я не мог видеть способ связывания let-n, поскольку промежуточное место было необходимо для хранения возвращаемого значения read-string, поэтому его можно было тестировать как число. Если это число, оно возвращается; else возвращает nil.
Ответ 4
Обратите внимание, что 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"