web-dev-qa-db-ja.com

書式設定されたBigDecimal値を印刷する方法は?

お金を表すBigDecimalフィールドamountがあり、$123.00$15.50$0.33などの形式でその値をブラウザに印刷する必要があります。

どうやってやるの?

(私が見る唯一の簡単な解決策は、floatValueからBigDecimalを取得し、NumberFormatを使用して小数部の精度を2桁にすることです)。

90
Roman
public static String currencyFormat(BigDecimal n) {
    return NumberFormat.getCurrencyInstance().format(n);
}

JVMの現在のデフォルト Locale を使用して通貨記号を選択します。または、Localeを指定できます。

NumberFormat.getInstance(Locale.US)

詳細については、「 NumberFormat class」を参照してください。

115
Luca Molteni

桁区切り記号を設定するには、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()の場合があります。

56
Jeff_Alieffson

特定の状況で意味をなす別の方法は、

BigDecimal newBD = oldBD.setScale(2);

場合によって小数点以下2桁を超えるお金については意味がないので、私はこれを言うだけです。これをさらに一歩進めると、これは

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

しかし、私は単にsetScaleメソッドを強調したいだけです(最後の小数点の処理方法を制御するために2番目の丸めモード引数を取ることもできます。状況によっては、Javaがこの丸め方法を指定するよう強制します)。

33
demongolem
 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を印刷します

10
Fluch

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