Clojure将货币字符串转换为浮动

Clojure将货币字符串转换为浮动,clojure,string-parsing,Clojure,String Parsing,我知道关于将字符串转换为浮点/数字/十进制有很多问题。。。但我的情况完全不同,因为我需要转换字符串数字(表示美元值),但我必须在转换中保留美分,这是我的情况 我收到了这个价值观 "96,26" "1.296,26" 我希望转换为以下内容: 96.26 1296.26 如果我试着使用clojure.edn,它可以逃出美分 (edn/读取字符串“1.296,26”) => 1.296 (edn/读取字符串“96,26”) => 96 如果我尝试使用另一种方法,比如bugdec,我会得到Numb

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

我收到了这个价值观 "96,26" "1.296,26" 我希望转换为以下内容: 96.26 1296.26

如果我试着使用clojure.edn,它可以逃出美分

(edn/读取字符串“1.296,26”)
=> 1.296
(edn/读取字符串“96,26”)
=> 96
如果我尝试使用另一种方法,比如bugdec,我会得到NumberFormatException

我知道我们可以做一些字符串替换,但这看起来像是一个大的工作,如下所示:

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

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

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

只需使用直接的Java互操作:

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

  (.parse nf "12,6")) => 12.6
请参阅Oracle文档:

及此帖:


您还可以获得
BigDecimal
,以避免任何舍入错误。看

(让[nf(DecimalFormat.”(DecimalFormatSymbols.Locale/意大利语))
>>(.setParseBigDecimal nf true)
结果(.parse nf“123.45,9”)]
结果=>

只需使用直接的Java互操作:

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

  (.parse nf "12,6")) => 12.6
请参阅Oracle文档:

及此帖:


您还可以获得
BigDecimal
,以避免任何舍入错误。请参阅

(让[nf(DecimalFormat.”(DecimalFormatSymbols.Locale/意大利语))
>>(.setParseBigDecimal nf true)
结果(.parse nf“123.45,9”)]
结果=>

要想真正挑剔一点,96.26的双精度浮点表示可能并不完全是96.26。要获得值96.26的精确表示,可以使用函数将其转换为比率,例如
(defn分数-100[x](/(Math/round(*100 x))100))
。例如尝试
(-96.26(-)(+ 96.26 100000) 100000))
在REPL中。如果需要精确值,请参见
DecimalFormat
DecimalFormatSymbols
。要真正挑剔,96.26的双精度浮点表示可能不是精确的96.26。要获得96.26值的精确表示,可以使用
(定义分数-100[x](/(数学/四舍五入(*100 x))100))
。请在回复中尝试示例
(-96.26(-(+96.26 100000)100000))
。如果需要精确值,请参阅
DecimalFormat
DecimalFormatSymbols