Clojure конвертировать строку валюты в float - PullRequest
1 голос
/ 06 февраля 2020

Я знаю, что есть много вопросов о преобразовании строки в число с плавающей запятой / число / десятичное число ... но мой случай совершенно другой, потому что мне нужно преобразовать число строки (представляющее значение в долларах), но я должен держать центы в это преобразование, вот мой случай.

Я получаю эти значения «96,26», «1,296,26», и я ожидаю преобразовать в это следующее: 96,26 1296,26

Если я попытаюсь использовать clojure.edn это экранирование центов

(edn/read-string "1.296,26")
=> 1.296
(edn/read-string "96,26")
=> 96

Если я попытаюсь использовать другой подход, например, bugde c, я получу NumberFormatException

Я знаю, что мы можем заменить некоторые строки, но это выглядит как большая работа вокруг, как это:

(-> "1.296,87"
    (clojure.string/replace #"\." "")
    (clojure.string/replace #"," ".")
    (edn/read-string))

Ответы [ 2 ]

5 голосов
/ 06 февраля 2020

что вы можете сделать, это использовать средства форматирования java:

(defn read-num [s]
  (let [format (java.text.NumberFormat/getNumberInstance java.util.Locale/GERMANY)]
    (.parse format s)))

user> (read-num "1.296,26")
;;=> 1296.26

user> (read-num "96,26")
;;=> 96.26
4 голосов
/ 06 февраля 2020

Просто используйте прямое Java взаимодействие:

(let [nf (java.text.NumberFormat/getInstance java.util.Locale/FRENCH)]

  (.parse nf "12,6")) => 12.6

См. Oracle документы: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/text/NumberFormat.html

и это объявление: https://www.baeldung.com/java-decimalformat


Вы также можете получить BigDecimal, чтобы избежать ошибок округления. См. https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/text/DecimalFormat.html#% 3Cinit% 3E (java .lang.String, java .text.DecimalFormatSymbols)

  (let [nf     (DecimalFormat. "" (DecimalFormatSymbols. Locale/ITALIAN))
        >>     (.setParseBigDecimal nf true)
        result (.parse nf "123.45,9")]

  result => <#java.math.BigDecimal 12345.9M>
...