Числовой и автоматический режимы

Базовая модель форматирования чисел в Intl.NumberFormat

Intl.NumberFormat строится вокруг идеи отделения логики представления числа от его фактического значения. Один и тот же числовой тип может быть представлен в разных режимах отображения: стандартном, компактном, научном или инженерном.

Ключевая особенность API заключается в том, что часть поведения определяется явно через параметры, а часть — делегируется системе локали. Это создаёт два слоя работы:

  • явно заданный режим форматирования
  • автоматический режим выбора формата на основе локали и значений по умолчанию

Автоматическое поведение как базовый режим Intl

При создании экземпляра Intl.NumberFormat без дополнительных опций применяется автоматический режим:

new Intl.NumberFormat('en-US').format(1234567);

В этом случае происходит:

  • выбор стандартного представления числа (notation: "standard")
  • использование системного набора цифр (numberingSystem по локали)
  • применение локальных разделителей тысяч и десятичной части
  • отсутствие преобразования масштаба числа

Автоматический режим здесь означает, что форматирование не навязывает конкретный способ отображения числа, а использует дефолтные правила локали.


Параметр notation: переключение режимов представления

Параметр 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

Принцип:

  • степень 10 всегда кратна 3
  • удобно для инженерных и физических расчётов

Компактная нотация

{ notation: 'compact' }

Активирует автоматическое сокращение числа:

new Intl.NumberFormat('en-US', { notation: 'compact' }).format(1200000);
// "1.2M"

Автоматический выбор уровня сокращения в compact

Компактный режим включает дополнительный слой автоматизации: выбор формы отображения зависит от величины числа.

new Intl.NumberFormat('en-US', {
  notation: 'compact',
  compactDisplay: 'short'
}).format(1500);

Поведение:

  • 1 000 → 1K
  • 1 000 000 → 1M
  • 1 000 000 000 → 1B

compactDisplay: автоматический стиль представления

compactDisplay: 'short' | 'long'
  • short — сокращённые обозначения (K, M, B)
  • long — текстовые формы (thousand, million)

Пример:

new Intl.NumberFormat('en-US', {
  notation: 'compact',
  compactDisplay: 'long'
}).format(1200000);
// "1.2 million"

Автоматичность проявляется в том, что выбор масштаба (тысячи, миллионы, миллиарды) происходит без ручного указания.


signDisplay: автоматическое управление знаком

Режим отображения знака числа также содержит автоматический режим:

{ 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);

В этом случае:

  • система цифр выбирается на основе локали
  • для арабских локалей могут использоваться восточные арабские цифры
  • для латинских локалей — стандартные 0–9

Явное задание:

{ numberingSystem: 'latn' }

Автоматический режим означает:

  • отсутствие принудительной системы цифр
  • делегирование выбора локализации окружению

Локаль как источник автоматических решений

Локаль влияет на множество параметров, которые не задаются явно:

  • разделители тысяч
  • десятичные символы
  • порядок группировки чисел
  • система цифр
  • правила округления по умолчанию

Пример:

new Intl.NumberFormat('de-DE').format(1234567.89);
// "1.234.567,89"

В автоматическом режиме:

  • точка и запятая меняются местами относительно en-US
  • группировка строго по три цифры
  • формат округления определяется локалью

Взаимодействие автоматических и явных режимов

Intl работает по приоритетной модели:

  1. Явно заданные параметры (notation, signDisplay, compactDisplay)
  2. Локальные настройки
  3. Системные дефолты

Пример конфликтного поведения:

new Intl.NumberFormat('en-US', {
  notation: 'compact',
  maximumFractionDigits: 2
}).format(1532000);
  • compact принудительно активирует масштабирование
  • maximumFractionDigits ограничивает точность
  • локаль влияет на суффиксы (K, M)

Автоматическое округление и его влияние на режим отображения

Округление чисел тесно связано с режимом отображения:

new Intl.NumberFormat('en-US', {
  notation: 'compact',
  maximumFractionDigits: 1
}).format(12500);
// "12.5K"

Автоматическое поведение включает:

  • выбор масштаба (тысячи)
  • адаптацию числа к точности
  • корректировку результата без вмешательства разработчика

Сравнение автоматического и ручного контроля

Автоматический режим

  • минимум конфигурации
  • максимальная зависимость от локали
  • адаптивное форматирование
  • подходит для UI общего назначения

Явные режимы

  • фиксированная форма вывода
  • предсказуемость отображения
  • контроль над масштабом и знаком
  • подходит для финансовых и научных систем

Поведение при отсутствии явных параметров

new Intl.NumberFormat().format(9876543.21);

Система выполняет:

  • выбор локали окружения (обычно браузерной)
  • применение стандартного notation
  • автоматическое округление до разумной точности
  • выбор системы цифр

Такой режим считается полностью автоматическим и используется как базовая стратегия форматирования.


Автоматизация как принцип проектирования Intl

Модель Intl построена на идее:

  • минимального вмешательства разработчика
  • максимальной локализации результата
  • адаптации к контексту выполнения

Числовые режимы — одна из областей, где автоматизация наиболее заметна: система сама решает, как представить число, если не заданы строгие ограничения.

Автоматическое поведение обеспечивает:

  • согласованность UI в разных регионах
  • снижение количества ошибок форматирования
  • единый подход к отображению числовых данных