【问题标题】:How to print formatted BigDecimal values?如何打印格式化的 BigDecimal 值?
【发布时间】:2011-03-24 16:11:55
【问题描述】:

我有一个代表钱的BigDecimal字段amount,我需要在浏览器中以$123.00$15.50$0.33等格式打印它的值。

我该怎么做?

(我看到自己唯一简单的解决方案是从BigDecimal 获取floatValue,然后使用NumberFormat 为小数部分设置两位数精度)。

【问题讨论】:

    标签: java formatting bigdecimal number-formatting


    【解决方案1】:

    我知道这个问题很老了,但我最近在我的 kotlin 应用程序中做了类似的事情。如果有人需要,这里有一个例子:

    val dfs = DecimalFormatSymbols.getInstance(Locale.getDefault())
    val bigD = BigDecimal("1e+30")
    val formattedBigD = DecimalFormat("#,##0.#",dfs).format(bigD)
    

    结果显示 $formattedBigD:

    1,000,000,000,000,000,000,000,000,000,000
    

    【讨论】:

      【解决方案2】:
      public static String currencyFormat(BigDecimal n) {
          return NumberFormat.getCurrencyInstance().format(n);
      }
      

      它将使用您的 JVM 当前默认的 Locale 来选择您的货币符号。或者您可以指定Locale

      NumberFormat.getInstance(Locale.US)
      

      有关详细信息,请参阅NumberFormat 类。

      【讨论】:

      • 是否可以像 DecimalFormat 一样指定模式?
      【解决方案3】:

      与@Jeff_Alieffson 的回答类似,但不依赖默认的Locale

      使用DecimalFormatSymbols 表示明确的语言环境:

      DecimalFormatSymbols decimalFormatSymbols  = DecimalFormatSymbols.getInstance(new Locale("ru", "RU"));
      

      或显式分隔符:

      DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
      decimalFormatSymbols.setDecimalSeparator('.');
      decimalFormatSymbols.setGroupingSeparator(' ');
      

      然后:

      new DecimalFormat("#,##0.00", decimalFormatSymbols).format(new BigDecimal("12345"));
      

      结果:

      12 345.00
      

      【讨论】:

        【解决方案4】:

        要设置千位分隔符,比如123,456.78,你必须使用DecimalFormat

             DecimalFormat df = new DecimalFormat("#,###.00");
             System.out.println(df.format(new BigDecimal(123456.75)));
             System.out.println(df.format(new BigDecimal(123456.00)));
             System.out.println(df.format(new BigDecimal(123456123456.78)));
        

        结果如下:

        123,456.75
        123,456.00
        123,456,123,456.78
        

        虽然我设置了#,###.00 掩码,但它也成功地格式化了较长的值。 请注意,结果中的逗号 (,) 分隔符取决于您的语言环境。对于俄语语言环境,它可能只是空格()。

        【讨论】:

        • 如果您希望零显示为 0.00(而不是 .00),请改用模式 "#,##0.00"
        【解决方案5】:
         BigDecimal pi = new BigDecimal(3.14);
         BigDecimal pi4 = new BigDecimal(12.56);
        
         System.out.printf("%.2f",pi);
        

        // 打印 3.14

        System.out.printf("%.0f",pi4);
        

        // 打印 13

        【讨论】:

          【解决方案6】:
          BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)
          

          【讨论】:

          • 应该是 BigDecimal(19.001).setScale(2, BigDecimal.ROUND_HALF_UP).toString()
          • setScale 已弃用
          【解决方案7】:

          另一种对给定情况有意义的方法是

          BigDecimal newBD = oldBD.setScale(2);
          

          我之所以这么说是因为在某些情况下,当涉及到超过小数点后 2 位的钱时,这是没有意义的。更进一步,这可能会导致

          String displayString = oldBD.setScale(2).toPlainString();
          

          但我只是想强调 setScale 方法(它也可以采用第二个舍入模式参数来控制如何处理最后一个小数位。在某些情况下,Java 会强制您指定此舍入方法)。

          【讨论】:

          • 我认为 java 在所有情况下都会强制执行,但关键是某些数字符合比例,例如 1.55,有些不喜欢 1.555,需要了解如何舍入 x.xx5部分。
          猜你喜欢
          • 2015-04-09
          • 1970-01-01
          • 2023-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-26
          • 2018-07-04
          相关资源
          最近更新 更多