Java 如何打印格式化的BigDecimal值?

Java 如何打印格式化的BigDecimal值?,java,formatting,bigdecimal,number-formatting,Java,Formatting,Bigdecimal,Number Formatting,我有一个表示货币的BigDecimal字段amount,我需要在浏览器中以$123.00,$15.50,$0.33等格式打印它的值 我该怎么做 (我自己看到的唯一简单的解决方案是从BigDecimal中获取floatValue,然后使用NumberFormat对分数部分进行两位精度计算) 它将使用JVM的当前默认值来选择货币符号。或者您可以指定区域设置 NumberFormat.getInstance(Locale.US) 有关更多信息,请参见课堂。另一种对给定情况有意义的方法是 BigDec

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

我该怎么做

(我自己看到的唯一简单的解决方案是从
BigDecimal
中获取
floatValue
,然后使用
NumberFormat
对分数部分进行两位精度计算)

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

NumberFormat.getInstance(Locale.US)

有关更多信息,请参见课堂。

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

BigDecimal newBD = oldBD.setScale(2);
我之所以这样说,是因为在某些情况下,当涉及到超过小数点后2位的货币时是没有意义的。再进一步,这可能导致

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

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

要设置千位分隔符,例如
123456.78
,您必须使用:

结果如下:

123,456.75
123,456.00
123,456,123,456.78
虽然我设置了
,####.00
掩码,但它也成功地格式化了较长的值。 请注意,结果中的逗号(,)分隔符取决于您的区域设置。它可能只是俄罗斯地区的空格()

BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)
//印刷品3.14

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

//打印13个类似于@Jeff_Alieffson的答案,但不依赖默认的
区域设置

对于显式区域设置,请使用
DecimalFormatSymbols

DecimalFormatSymbols decimalFormatSymbols  = DecimalFormatSymbols.getInstance(new Locale("ru", "RU"));
或显式分隔符符号:

DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator('.');
decimalFormatSymbols.setGroupingSeparator(' ');
然后:

结果:

12 345.00

我知道这个问题很老了,但最近我在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

如果希望0显示为0.00(而不是.00),请使用模式
“#,###0.00”
。应为BigDecimal(19.001)。setScale(2,BigDecimal.ROUND_-UP)。toString()setScale不受欢迎。是否可以像DecimalFormat那样指定模式?
new DecimalFormat("#,##0.00", decimalFormatSymbols).format(new BigDecimal("12345"));
12 345.00
val dfs = DecimalFormatSymbols.getInstance(Locale.getDefault())
val bigD = BigDecimal("1e+30")
val formattedBigD = DecimalFormat("#,##0.#",dfs).format(bigD)
1,000,000,000,000,000,000,000,000,000,000