Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как отформатировать цену

Короткий ответ

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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.