Clojure 将货币字符串转换为浮点数
Clojure convert currency string to float
我知道有很多关于将字符串转换为 float/number/decimal 的问题......但我的情况完全不同,因为我需要转换字符串数字(代表美元价值)但我必须保留此转换中的美分,这是我的情况。
我收到这个值
“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))
您可以使用 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 文档: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>
我知道有很多关于将字符串转换为 float/number/decimal 的问题......但我的情况完全不同,因为我需要转换字符串数字(代表美元价值)但我必须保留此转换中的美分,这是我的情况。
我收到这个值 “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))
您可以使用 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 文档: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>