Подтвердить что ты не робот

Как преобразовать числовую строку в число (десятичный) и число в строку

Как мне начать писать функцию для преобразования десятичной строки в десятичный и десятичный числа в строку?

4b9b3361

Ответ 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"