如何打印格式化的BigDecimal值?


104

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

我怎样才能做到这一点?

(我看到的唯一简单的解决方案是floatValue从中获取分数BigDecimal,然后使用它NumberFormat来使小数部分达到两位数的精度)。

Answers:



70

要设置千位分隔符,说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遮罩,但它也成功地格式化了较长的值。请注意,结果中的逗号(,)分隔符取决于您的语言环境。对于俄罗斯语言环境,可能只是space()。


19
如果您希望零显示为0.00(而不是.00),请改用该模式"#,##0.00"
约尼克

35

对于给定情况,另一种可能有意义的方法是

BigDecimal newBD = oldBD.setScale(2);

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

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

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


14
 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

与@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

1
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)

1
应该是BigDecimal(19.001).setScale(2,BigDecimal.ROUND_HALF_UP).toString()
Jeff Tsay
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.