Как отформатировать цену
Короткий ответ
Intl.NumberFormat со style: 'currency' добавляет знак валюты, разделители и два знака после запятой:
const price = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
console.log(price.format(1234.5));Результат:
$1,234.50Другие страны
Язык определяет, где стоит знак и какие используются разделители:
console.log(new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(1234.5));
console.log(new Intl.NumberFormat('en-GB', { style: 'currency', currency: 'EUR' }).format(1234.5));Результат:
1.234,50 €
€1,234.50Без центов
Для целых сумм задайте ноль знаков после запятой:
const price = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 });
console.log(price.format(1999));Результат:
$1,999Хранение в центах
Чтобы избежать ошибок округления, магазины часто хранят цены в центах целыми числами и делят на 100 только при выводе:
const cents = 1999 + 2999;
const price = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
console.log(price.format(cents / 100));Результат:
$49.98Частая ошибка
toFixed(2) только округляет: ни валюты, ни разделителей тысяч он не добавляет:
console.log('$' + (1234.5).toFixed(2));Результат:
$1234.50Функции из этого ответа
- Intl.NumberFormat — Форматирует числа, валюты, проценты и единицы измерения по правилам языка.
- Number.prototype.toLocaleString — Форматирует число по правилам языка: разделители разрядов, валюта, проценты.