【问题标题】:Clojure convert currency string to floatClojure 将货币字符串转换为浮点数
【发布时间】:2020-05-22 13:58:51
【问题描述】:

我知道有很多关于将字符串转换为浮点数/数字/十进制的问题......但我的情况完全不同,因为我需要转换字符串数字(代表美元值)但我必须保留美分这种转换,这是我的情况。

我收到这个值 “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

如果我尝试使用其他方法,例如 bugdec,我会得到 NumberFormatException

我知道我们可以做一些字符串替换,但它看起来像一个很大的工作,像这样:

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

【问题讨论】:

    标签: clojure string-parsing


    【解决方案1】:

    你可以做的是使用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
    

    【讨论】:

    • 真正挑剔的是,96.26 的双精度浮点表示可能不完全是 96.26。要获得值 96.26 的精确表示,可以使用诸如(defn fraction-of-100 [x] (/ (Math/round (* 100 x)) 100)) 之类的函数将其转换为比率。
    • 在 REPL 中尝试例如(- 96.26 (- (+ 96.26 100000) 100000))
    • 如果您需要精确值,请参阅 DecimalFormatDecimalFormatSymbols
    【解决方案2】:

    只需使用直接的 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>
    

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 1970-01-01
      • 2012-01-15
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 2011-11-25
      相关资源
      最近更新 更多