代码之家  ›  专栏  ›  技术社区  ›  Chris Murphy

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

  •  0
  • Chris Murphy  · 技术社区  · 6 年前

    我想在Clojure中将“numeric”字符串格式化为“string number”。这是格式掩码:

    给定字符串“9999.99”,我希望返回“9999.99”。

    在Clojure中如何做到这一点而不需要编写转换函数,即使用 format

    3 回复  |  直到 6 年前
        1
  •  1
  •   Taylor Wood    6 年前

    你可以用 ,

    (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
  •  3
  •   Bob Jarvis - Слава Україні    6 年前

    看来在你的问题领域,二进制基浮点(例如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格式字符串约定,则必须编写一个转换函数。

    祝你好运。

        3
  •  1
  •   Alan Thompson    6 年前

    NumberFormat . 我也喜欢另一个答案(见 the Java 10 Formatter docs 详细信息):

    (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,首先使用Java互操作,然后使用内置Clojure函数 bigdec :

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