Clojure将货币字符串转换为浮动
我知道关于将字符串转换为浮点/数字/十进制有很多问题。。。但我的情况完全不同,因为我需要转换字符串数字(表示美元值),但我必须在转换中保留美分,这是我的情况 我收到了这个价值观 "96,26" "1.296,26" 我希望转换为以下内容: 96.26 1296.26 如果我试着使用clojure.edn,它可以逃出美分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
(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
。