Как распечатать форматированные значения BigDecimal?

104

У меня есть BigDecimalполе , amountкоторое представляет деньги, и мне нужно напечатать его значение в браузере в формате , как $123.00, $15.50, $0.33.

Как я могу это сделать?

(Единственное простое решение , которое я вижу себя получает floatValueот BigDecimalа затем использовать , NumberFormatчтобы сделать две цифры точности для дробной части).

Римский
источник

Ответы:

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

Он будет использовать текущее значение Localeпо умолчанию вашей JVM для выбора символа валюты. Или вы можете указать Locale.

NumberFormat.getInstance(Locale.US)

Для получения дополнительной информации см. NumberFormatКласс.

Лука Молтени
источник
Можно ли указать шаблон так же, как DecimalFormat?
Филипп Джозеффи,
71

Чтобы установить разделитель тысяч, скажем, 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маску, она успешно форматирует и более длинные значения. Обратите внимание, что разделитель запятой (,) в результате зависит от вашего языкового стандарта. Это может быть просто пробел () для русской локали.

Джефф Алиффсон
источник
19
Если вы предпочитаете, чтобы ноль отображался как 0,00 (вместо 0,00), используйте "#,##0.00"вместо этого шаблон .
Jonik
35

Другой способ, который может иметь смысл в данной ситуации:

BigDecimal newBD = oldBD.setScale(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

Fluch
источник
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 ()
Джефф Тсей