Как отформатировать цену
Короткий ответ
NumberFormat.getCurrencyInstance() форматирует сумму по правилам страны — символ валюты, разделители и количество копеек:
void main() {
var price = new BigDecimal("1234.5");
IO.println(NumberFormat.getCurrencyInstance(Locale.US).format(price));
IO.println(NumberFormat.getCurrencyInstance(Locale.GERMANY).format(price));
}Результат:
$1,234.50
1.234,50 €Немецкий формат использует неразрывный пробел перед €.
Простой формат
Если правила страны не важны, хватит String.format() с локалью:
void main() {
double total = 1234.5;
IO.println(String.format(Locale.US, "$%,.2f", total));
}Результат:
$1,234.50Другая валюта
Чтобы показать евро в американском формате, задайте валюту отдельно:
void main() {
NumberFormat format = NumberFormat.getCurrencyInstance(Locale.US);
format.setCurrency(Currency.getInstance("EUR"));
IO.println(format.format(99.9));
}Результат:
€99.90Без копеек
Для круглых сумм уберите дробную часть:
void main() {
NumberFormat format = NumberFormat.getCurrencyInstance(Locale.US);
format.setMaximumFractionDigits(0);
IO.println(format.format(2500));
}Результат:
$2,500Частая ошибка
Склеивать символ валюты и double напрямую. Число выводится без копеек или с лишними знаками:
void main() {
IO.println("$" + 10.0);
IO.println("$" + 0.1 * 3);
}Результат:
$10.0
$0.30000000000000004Функции из этого ответа
- NumberFormat — Форматирует числа, деньги и проценты по правилам выбранной страны.
- BigDecimal — Точное десятичное число — для денег и расчётов, где недопустимы ошибки округления double.
- String.format() — Собирает строку по шаблону с подстановками вроде %s и %d.