如何打印格式化的 BigDecimal 值?

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

我该怎么做?

(我认为唯一简单的解决方案是从 BigDecimal中获得 floatValue,然后使用 NumberFormat对分数部分进行两位数的精度)。

252920 次浏览
public static String currencyFormat(BigDecimal n) {
return NumberFormat.getCurrencyInstance().format(n);
}

它将使用 JVM 的当前默认 Locale来选择货币符号。

NumberFormat.getInstance(Locale.US)

有关更多信息,请参见 NumberFormat类。

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

BigDecimal newBD = oldBD.setScale(2);

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

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

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

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

BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)
 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

类似@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

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

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

显示 $format tedBigD 的结果:

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