Intl.NumberFormat предоставляет механизм локализованного
форматирования чисел с учётом правил конкретного языка и региона.
Основная задача — преобразование числовых значений в строковое
представление с правильными разделителями, округлением, обозначениями
валют и другими параметрами отображения.
Создание форматтера происходит через конструктор:
const formatter = new Intl.NumberFormat('ru-RU');
Первый аргумент определяет локаль. Влияние локали проявляется в выборе десятичного разделителя, группировке разрядов, порядке отображения символов и правилах округления.
Форматирование выполняется методом format:
formatter.format(1234567.89);
// "1 234 567,89"
Локаль задаёт правила визуального представления чисел:
Примеры различий:
new Intl.NumberFormat('en-US').format(1234567.89);
// "1,234,567.89"
new Intl.NumberFormat('de-DE').format(1234567.89);
// "1.234.567,89"
new Intl.NumberFormat('hi-IN').format(1234567.89);
// "12,34,567.89"
Группировка цифр зависит от региональных стандартов, а не от фиксированного алгоритма.
Параметр style определяет тип представления числа.
Стандартный числовой формат:
new Intl.NumberFormat('ru-RU', { style: 'decimal' }).format(1000);
// "1 000"
Используется по умолчанию.
Форматирование денежных значений с привязкой к валюте:
new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'RUB'
}).format(1234.5);
// "1 234,50 ₽"
Поддерживаются коды валют ISO 4217. Отображение символа валюты зависит от локали.
Дополнительные параметры:
currencyDisplay:
"symbol" | "narrowSymbol" | "code" | "name"currencySign:
"standard" | "accounting"Пример:
new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
currencyDisplay: 'code'
}).format(99);
// "USD 99.00"
Процентное представление чисел:
new Intl.NumberFormat('ru-RU', {
style: 'percent'
}).format(0.25);
// "25 %"
Значение автоматически умножается на 100.
Форматирование с единицами измерения:
new Intl.NumberFormat('ru-RU', {
style: 'unit',
unit: 'kilometer'
}).format(50);
// "50 км"
Дополнительный параметр:
unitDisplay:
"long" | "short" | "narrow"Параметры управления точностью:
minimumFractionDigitsmaximumFractionDigitsminimumIntegerDigitsminimumSignificantDigitsmaximumSignificantDigitsПример контроля дробной части:
new Intl.NumberFormat('ru-RU', {
minimumFractionDigits: 2,
maximumFractionDigits: 2
}).format(12);
// "12,00"
Ограничение значащих цифр:
new Intl.NumberFormat('ru-RU', {
minimumSignificantDigits: 3,
maximumSignificantDigits: 3
}).format(12345.6);
// "12 300"
Алгоритмы округления соответствуют стандарту ICU и учитывают локальные правила.
Параметр useGrouping управляет разделением числа на
группы:
new Intl.NumberFormat('ru-RU', {
useGrouping: true
}).format(1000000);
// "1 000 000"
Возможные значения:
true — включеноfalse — отключено"auto" — автоматический выбор"always" — принудительное включениеПараметр notation изменяет формат вывода больших и малых
чисел.
Обычное представление:
new Intl.NumberFormat('ru-RU', {
notation: 'standard'
}).format(1000000);
// "1 000 000"
Экспоненциальная форма:
new Intl.NumberFormat('ru-RU', {
notation: 'scientific'
}).format(12345);
// "1,2345E4"
Инженерная нотация с кратностью 10³:
new Intl.NumberFormat('ru-RU', {
notation: 'engineering'
}).format(12345);
// "12,345E3"
Сокращённая форма для больших чисел:
new Intl.NumberFormat('ru-RU', {
notation: 'compact'
}).format(1500000);
// "1,5 млн"
Дополнительный параметр:
compactDisplay: "short" | "long"new Intl.NumberFormat('ru-RU', {
notation: 'compact',
compactDisplay: 'long'
}).format(1500000);
// "1,5 миллиона"
Параметр signDisplay контролирует отображение плюса и
минуса:
new Intl.NumberFormat('ru-RU', {
signDisplay: 'always'
}).format(10);
// "+10"
Возможные значения:
auto — только отрицательные значенияalways — всегда отображать знакnever — скрывать знакexceptZero — скрывать для нуляПараметр numberingSystem задаёт используемую цифровую
систему:
new Intl.NumberFormat('ar-EG-u-nu-arab').format(1234);
// использование араб-индийских цифр
Поддерживаются системы:
Метод formatToParts возвращает структуру
форматированного числа:
new Intl.NumberFormat('ru-RU').formatToParts(1234.5);
Результат:
[
{ type: 'integer', value: '1' },
{ type: 'group', value: ' ' },
{ type: 'integer', value: '234' },
{ type: 'decimal', value: ',' },
{ type: 'fraction', value: '5' }
]
Типы частей:
Такой формат позволяет собирать кастомные представления без потери локализации.
Метод formatRange позволяет отображать интервалы:
new Intl.NumberFormat('ru-RU').formatRange(10, 20);
// "10–20"
Используется единый формат с учётом локального символа диапазона.
Метод formatRangeToParts возвращает структурированное
представление диапазона с разделением на элементы первой и второй
границы.
Создание Intl.NumberFormat — относительно дорогостоящая
операция. Практика оптимизации предполагает повторное использование
экземпляров:
const nf = new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'RUB'
});
function formatPrice(value) {
return nf.format(value);
}
Такой подход снижает нагрузку при массовом форматировании.
Форматирование учитывает специальные случаи:
"NaN""∞""-∞"new Intl.NumberFormat('ru-RU').format(NaN);
// "NaN"
Округление выполняется по правилам, зависящим от конфигурации
точности, а не от встроенного Math.round.
Не все комбинации параметров поддерживаются одинаково во всех окружениях. При отсутствии поддержки браузер может игнорировать часть опций и применять ближайшие допустимые значения согласно ICU-таблицам локализации.
Особенно это касается:
unitnotation: 'compact'numberingSystemПоведение в таких случаях определяется реализацией движка JavaScript.