JavaScript Intl.NumberFormat: числа и валюты
Intl.NumberFormat форматирует числа по правилам выбранной локали: разделители тысяч, десятичный разделитель, валюта, проценты и компактная запись. Форматтер создаётся один раз и переиспользуется, а не вызывается в цикле рендера. Это заменяет ручные регулярные выражения и toFixed.
Отформатировать цену и процент
const price = new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
maximumFractionDigits: 0,
});
const percent = new Intl.NumberFormat("en-US", {
style: "percent",
maximumFractionDigits: 1,
});
console.log(price.format(1234567)); // $1,234,567
console.log(percent.format(0.256)); // 25.6%style: "currency" добавляет символ валюты и учитывает число знаков после запятой, принятое для неё. maximumFractionDigits ограничивает дробную часть, но не заменяет денежные расчёты: храните суммы в минимальных единицах или Decimal, а Intl используйте только для вывода. Для российского формата замените локаль на ru-RU и валюту на RUB — разделители и положение символа изменятся автоматически.
Показать компактное число
const compact = new Intl.NumberFormat("en-US", {
notation: "compact",
maximumFractionDigits: 1,
});
console.log(compact.format(1234567)); // 1.2Mnotation: "compact" выбирает сокращение (K, M, B) по локали. Для научных значений есть notation: "scientific", для инженерных — "engineering". Опция useGrouping: false отключает разделители тысяч, а minimumFractionDigits задаёт минимальное число знаков.
Форматтер поддерживается во всех современных браузерах и Node.js. Локаль можно не указывать — тогда используется локаль окружения, но для серверного рендера и тестов лучше задавать её явно. Список поддерживаемых локалей проверяйте через Intl.NumberFormat.supportedLocalesOf([...]).
Не создавайте новый Intl.NumberFormat на каждый элемент списка: конструктор выполняет анализ локали и опций. Вынесите форматтер в модуль или мемоизируйте по ключу локали. Помните, что format() округляет значение; для финансовых отчётов сначала определите правило округления, а потом форматируйте.
Документация: Intl.NumberFormat, поддерживаемые локали.