JavaScript Intl.NumberFormat: числа и валюты

Категория: JavaScript · Язык: JavaScript · Обновлено:

Intl.NumberFormat форматирует числа по правилам выбранной локали: разделители тысяч, десятичный разделитель, валюта, проценты и компактная запись. Форматтер создаётся один раз и переиспользуется, а не вызывается в цикле рендера. Это заменяет ручные регулярные выражения и toFixed.

Отформатировать цену и процент

JavaScript
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 — разделители и положение символа изменятся автоматически.

Показать компактное число

JavaScript
const compact = new Intl.NumberFormat("en-US", {
    notation: "compact",
    maximumFractionDigits: 1,
});
console.log(compact.format(1234567)); // 1.2M

notation: "compact" выбирает сокращение (K, M, B) по локали. Для научных значений есть notation: "scientific", для инженерных — "engineering". Опция useGrouping: false отключает разделители тысяч, а minimumFractionDigits задаёт минимальное число знаков.

Форматтер поддерживается во всех современных браузерах и Node.js. Локаль можно не указывать — тогда используется локаль окружения, но для серверного рендера и тестов лучше задавать её явно. Список поддерживаемых локалей проверяйте через Intl.NumberFormat.supportedLocalesOf([...]).

Не создавайте новый Intl.NumberFormat на каждый элемент списка: конструктор выполняет анализ локали и опций. Вынесите форматтер в модуль или мемоизируйте по ключу локали. Помните, что format() округляет значение; для финансовых отчётов сначала определите правило округления, а потом форматируйте.

Документация: Intl.NumberFormat, поддерживаемые локали.