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

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

Основной принцип заключается в замене длинной числовой записи на краткую форму с масштабным обозначением. Вместо 1 000 отображается 1K, вместо 1 000 0001M, при этом конкретный формат зависит от выбранной локали.

Базовая активация compact-режима

Компактная нотация включается через параметр notation: "compact".

const formatter = new Intl.NumberFormat("en-US", {
  notation: "compact"
});

formatter.format(1200);     // "1.2K"
formatter.format(1500000);  // "1.5M"
formatter.format(980);      // "980"

В этом режиме происходит автоматическое масштабирование числа по степеням тысячи. Значения округляются до удобочитаемого вида.

Влияние локали на форматирование

Компактная нотация строго зависит от локали, так как обозначения масштабов различаются между языками и регионами.

const en = new Intl.NumberFormat("en-US", { notation: "compact" });
const ru = new Intl.NumberFormat("ru-RU", { notation: "compact" });

en.format(1500000); // "1.5M"
ru.format(1500000); // "1,5 млн"

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

compactDisplay: управление степенью сокращения

Параметр compactDisplay управляет тем, насколько агрессивно происходит сокращение чисел.

Доступны два значения:

  • "short" — короткие обозначения (по умолчанию)
  • "long" — полные словесные формы

Короткая форма

const shortFormatter = new Intl.NumberFormat("en-US", {
  notation: "compact",
  compactDisplay: "short"
});

shortFormatter.format(1200000); // "1.2M"

Длинная форма

const longFormatter = new Intl.NumberFormat("en-US", {
  notation: "compact",
  compactDisplay: "long"
});

longFormatter.format(1200000); // "1.2 million"

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

Масштабирование и правила округления

Компактная нотация автоматически выбирает порядок величины числа:

  • тысячи (10³)
  • миллионы (10⁶)
  • миллиарды (10⁹)
  • триллионы (10¹²)

При этом используется округление, управляемое стандартными правилами Intl.NumberFormat.

const f = new Intl.NumberFormat("en-US", {
  notation: "compact",
  maximumFractionDigits: 1
});

f.format(1250);      // "1.3K"
f.format(1999000);   // "2M"

Округление может приводить к переходу в следующую категорию масштаба, если значение достигает порогового уровня.

Поведение при малых числах

Числа, не достигшие тысячного порога, не сокращаются.

const formatter = new Intl.NumberFormat("en-US", {
  notation: "compact"
});

formatter.format(999); // "999"

Это важно для сохранения точности восприятия данных в диапазоне малых значений.

Сочетание с другими параметрами форматирования

Компактная нотация работает совместно с другими параметрами Intl.NumberFormat, включая стиль, знаки, валюту и процентные значения.

Валюты

const currencyFormatter = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  notation: "compact"
});

currencyFormatter.format(2500000); // "$2.5M"

Валютный символ сохраняется, а числовая часть сокращается.

Проценты

const percentFormatter = new Intl.NumberFormat("en-US", {
  style: "percent",
  notation: "compact"
});

percentFormatter.format(0.25); // "25%"

В случае процентов компактная нотация чаще всего не влияет на отображение малых значений, так как диапазон ограничен.

Локализационные различия и семантика сокращений

Компактные обозначения не являются универсальными символами. Они зависят от языковых правил и культурных соглашений.

Примеры различий:

  • английский: K, M, B
  • русский: тыс., млн, млрд
  • японский: использование канзи-единиц масштаба

Это означает, что одинаковое число может визуально существенно отличаться при смене локали, даже если его значение остаётся неизменным.

Влияние на UX и плотность информации

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

  • счётчики просмотров и лайков
  • финансовые показатели
  • метрики аналитики
  • статистика пользователей

При этом важно учитывать, что чрезмерное сокращение может скрывать точные значения, особенно при сравнении близких чисел.

Особенности вычисления и производительности

Intl.NumberFormat с компактной нотацией использует встроенные механизмы движка JavaScript и ICU-библиотеки. Это обеспечивает:

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

Создание экземпляра форматтера дорогостоящей операцией считается относительно, поэтому повторное использование одного объекта предпочтительнее, чем создание нового для каждого вызова.

const formatter = new Intl.NumberFormat("en-US", {
  notation: "compact"
});

// повторное использование
formatter.format(1000);
formatter.format(2000);
formatter.format(3000);

Границы применимости

Компактная нотация не предназначена для:

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

Она ориентирована на визуальное представление агрегированных данных, где допустимо округление и сокращение масштаба.