Intl.NumberFormat строится вокруг идеи отделения
логики представления числа от его фактического значения. Один и
тот же числовой тип может быть представлен в разных режимах отображения:
стандартном, компактном, научном или инженерном.
Ключевая особенность API заключается в том, что часть поведения определяется явно через параметры, а часть — делегируется системе локали. Это создаёт два слоя работы:
При создании экземпляра Intl.NumberFormat без
дополнительных опций применяется автоматический режим:
new Intl.NumberFormat('en-US').format(1234567);
В этом случае происходит:
notation: "standard")numberingSystem
по локали)Автоматический режим здесь означает, что форматирование не навязывает конкретный способ отображения числа, а использует дефолтные правила локали.
Параметр notation задаёт способ интерпретации числового
значения.
new Intl.NumberFormat('en-US', { notation: 'standard' });
new Intl.NumberFormat('en-US', { notation: 'scientific' });
new Intl.NumberFormat('en-US', { notation: 'engineering' });
new Intl.NumberFormat('en-US', { notation: 'compact' });
{ notation: 'standard' }
Поведение:
Пример:
new Intl.NumberFormat('en-US', { notation: 'standard' }).format(1000000);
// "1,000,000"
Это режим, который фактически соответствует автоматическому поведению по умолчанию.
{ notation: 'scientific' }
Число преобразуется в форму:
[ a × 10^n]
Пример:
new Intl.NumberFormat('en-US', { notation: 'scientific' }).format(1000000);
// "1E6"
Особенности:
minimumFractionDigits и
maximumFractionDigits{ notation: 'engineering' }
Отличается от научной тем, что степень кратна 3:
new Intl.NumberFormat('en-US', { notation: 'engineering' }).format(1000000);
// "1E6"
Для:
10000000 -> 10E6
Принцип:
{ notation: 'compact' }
Активирует автоматическое сокращение числа:
new Intl.NumberFormat('en-US', { notation: 'compact' }).format(1200000);
// "1.2M"
Компактный режим включает дополнительный слой автоматизации: выбор формы отображения зависит от величины числа.
new Intl.NumberFormat('en-US', {
notation: 'compact',
compactDisplay: 'short'
}).format(1500);
Поведение:
compactDisplay: 'short' | 'long'
Пример:
new Intl.NumberFormat('en-US', {
notation: 'compact',
compactDisplay: 'long'
}).format(1200000);
// "1.2 million"
Автоматичность проявляется в том, что выбор масштаба (тысячи, миллионы, миллиарды) происходит без ручного указания.
Режим отображения знака числа также содержит автоматический режим:
{ signDisplay: 'auto' }
new Intl.NumberFormat('en-US', {
signDisplay: 'auto'
}).format(-10);
// "-10"
Поведение auto:
Альтернативные режимы:
signDisplay: 'always'
signDisplay: 'exceptZero'
signDisplay: 'negative'
Пример различий:
new Intl.NumberFormat('en-US', { signDisplay: 'always' }).format(10);
// "+10"
Автоматический режим здесь важен как дефолтное поведение, сохраняющее математическую нейтральность отображения.
Параметр numberingSystem также может работать в режиме
автоопределения:
new Intl.NumberFormat('ar-EG').format(123456);
В этом случае:
Явное задание:
{ numberingSystem: 'latn' }
Автоматический режим означает:
Локаль влияет на множество параметров, которые не задаются явно:
Пример:
new Intl.NumberFormat('de-DE').format(1234567.89);
// "1.234.567,89"
В автоматическом режиме:
Intl работает по приоритетной модели:
Пример конфликтного поведения:
new Intl.NumberFormat('en-US', {
notation: 'compact',
maximumFractionDigits: 2
}).format(1532000);
compact принудительно активирует масштабированиеmaximumFractionDigits ограничивает точностьОкругление чисел тесно связано с режимом отображения:
new Intl.NumberFormat('en-US', {
notation: 'compact',
maximumFractionDigits: 1
}).format(12500);
// "12.5K"
Автоматическое поведение включает:
new Intl.NumberFormat().format(9876543.21);
Система выполняет:
Такой режим считается полностью автоматическим и используется как базовая стратегия форматирования.
Модель Intl построена на идее:
Числовые режимы — одна из областей, где автоматизация наиболее заметна: система сама решает, как представить число, если не заданы строгие ограничения.
Автоматическое поведение обеспечивает: