Как печатать форматированные значения BigDecimal?
У меня есть поле BigDecimal
amount
, которое представляет собой деньги, и мне нужно распечатать его значение в браузере в формате $123.00
, $15.50
, $0.33
.
Как я могу это сделать?
(Единственное простое решение, которое я вижу сам, - это получить floatValue
от BigDecimal
, а затем с помощью NumberFormat
сделать двузначную точность для части дроби).
Ответы
Ответ 1
public static String currencyFormat(BigDecimal n) {
return NumberFormat.getCurrencyInstance().format(n);
}
Он будет использовать текущие значения по умолчанию для ваших JVM Locale
, чтобы выбрать символ валюты. Или вы можете указать Locale
.
NumberFormat.getInstance(Locale.US)
Для получения дополнительной информации см. NumberFormat
класс.
Ответ 2
Чтобы установить разделитель тысяч, скажем, 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
, она успешно форматирует и более длинные значения. Обратите внимание, что разделитель запятой (,) в результате зависит от вашей локали. Это может быть просто пробел() для русской локали.
Ответ 3
Другим способом, который может иметь смысл для данной ситуации, является
BigDecimal newBD = oldBD.setScale(2);
Я просто говорю это, потому что в некоторых случаях, когда речь идет о деньгах, выходящих за пределы 2 десятичных знаков, это не имеет смысла. Сделав это еще дальше, это может привести к
String displayString = oldBD.setScale(2).toPlainString();
но я просто хотел выделить метод setScale (который также может принимать второй аргумент режима округления для управления обработкой последнего десятичного знака. В некоторых ситуациях Java заставляет указать этот метод округления).
Ответ 4
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
Ответ 5
Аналогичен ответу @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
Ответ 6
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)