将“数字”字符串格式化为数字

时间:2018-09-02 03:22:06

标签: clojure

我想在Clojure中将“数字”字符串格式化为“字符串编号”。这是格式掩码:

  

“#,###,###,## 0.00”

给出字符串“ 9999.99”,我希望收到“ 9,999.99”。

我如何在Clojure中做到这一点,而不必诉诸编写转换器函数,即使用format或类似的东西?

3 个答案:

答案 0 :(得分:3)

似乎在您的问题域中,基于二进制的浮点(例如IEEE-754)的缺点和局限性给您带来了一些困难。也许您应该考虑利用已经内置在Clojure中的BigDecimal支持。在Clojure中,BigDecimal常数与浮点常数之间的差是单个字符;例如1.2是Double,而1.2M是BigDecimal。 bigdec函数可用于将内容即时转换为BigDecimal。例如,

(format "%,.2f" (bigdec "9999999999999999.12"))

产生

"9,999,999,999,999,999.12"

符合预期。 *+-/之类的算术功能也可以按预期工作。

但是,这不能解决您的基本问题。如果您的格式字符串不遵循Java / Clojure格式字符串约定,则必须编写一个转换器函数。

好运。

答案 1 :(得分:1)

您可以在格式说明符中使用,

(format "%,.2f" (float (clojure.edn/read-string "9999")))
=> "9,999.00"
(format "%,.2f" (Double/parseDouble "9999.126"))
=> "9,999.13"

更新为包含bigdec示例:

(format "%,.2f" (bigdec "9999999999999999.12"))
=> "9,999,999,999,999,999.12"

答案 2 :(得分:1)

您可以使用HYPERLINK(CONCAT())进行此操作。我也喜欢其他答案(有关详细信息,请参见the Java 10 Formatter docs):

NumberFormat

更新

以下是使用Big Java互操作然后使用内置Clojure函数(ns tst.demo.core (:use demo.core tupelo.core tupelo.test) (:import [java.text NumberFormat] [java.util Locale])) (dotest (let [value (Double/valueOf "1234567.89") nf (NumberFormat/getNumberInstance (Locale/US)) s1a (.format nf (.doubleValue value)) s1b (format "%,05.2f" value)] (spyx s1a) (spyx s1b)) s1a => "1,234,567.89" s1b => "1,234,567.89" (let [value (Double/valueOf "1.2") nf (NumberFormat/getNumberInstance (Locale/US)) s1a (.format nf (.doubleValue value)) s1b (format "%,05.2f" value)] (spyx s1a) (spyx s1b))) s1a => "1.2" s1b => "01.20" 为BigDecimal进行操作的方法:

bigdec