Компактная нотация в интернационализации предназначена для сокращённого представления чисел и величин, особенно в интерфейсах с ограниченным пространством: дашбордах, мобильных приложениях, финансовых панелях, метриках аналитики. В экосистеме FormatJS она реализуется через стандартные механизмы Intl API и интегрируется в форматирование сообщений ICU.
Основной механизм компактного отображения чисел опирается на параметр
notation: 'compact' в Intl.NumberFormat. Он
активирует сокращённые формы представления величин:
const nf = new Intl.NumberFormat('en-US', {
notation: 'compact',
compactDisplay: 'short'
});
nf.format(1200); // "1.2K"
nf.format(1500000); // "1.5M"
nf.format(2300000000); // "2.3B"
Ключевые параметры:
notation: 'compact' — включение компактного
режима
compactDisplay: 'short' | 'long' — стиль
сокращения
short: “1K”, “1M”long: “1 thousand”, “1 million”Локаль влияет на правила сокращения. Например:
new Intl.NumberFormat('ru-RU', {
notation: 'compact'
}).format(1500000);
// "1,5 млн"
Компактная нотация является частью CLDR-данных, на которых базируется FormatJS. Разные языки используют различные суффиксы и правила округления:
Это означает, что компактная форма не является просто строковой заменой, а результатом локализованного числового моделирования.
В системе сообщений ICU компактная нотация применяется не напрямую как параметр числа, а через предварительно отформатированные значения.
Пример базового использования:
import { defineMessages, useIntl } from 'react-intl';
const messages = defineMessages({
followers: {
id: 'user.followers',
defaultMessage: '{count} подписчиков'
}
});
const value = new Intl.NumberFormat('ru-RU', {
notation: 'compact'
}).format(15300);
// value = "15,3 тыс."
Далее результат подставляется в сообщение:
intl.formatMessage(messages.followers, {
count: value
});
Такой подход разделяет:
В реальных сценариях компактная нотация часто используется в UI-строках, где важна плотность информации:
const impressions = new Intl.NumberFormat('en', {
notation: 'compact'
}).format(984321);
const clicks = new Intl.NumberFormat('en', {
notation: 'compact'
}).format(12034);
Далее в ICU-шаблоне:
{
"stats": "{impressions} impressions · {clicks} clicks"
}
Компактная нотация автоматически применяет правила округления:
new Intl.NumberFormat('en', {
notation: 'compact',
maximumFractionDigits: 1
}).format(1599);
// "1.6K"
Параметры:
maximumFractionDigits — контроль точностиminimumFractionDigits — сохранение разрядностиroundingMode (в современных реализациях) — стратегия
округленияКомпактная нотация чувствительна к переходам между степенями:
999 -> "999"
1000 -> "1K"
999999 -> "999.9K"
1000000 -> "1M"
Эти границы определяются локализационными правилами CLDR, а не фиксированными степенями 10³.
В архитектуре FormatJS компактные числа часто используются как промежуточный слой форматирования:
function formatCompactNumber(intl, value) {
return intl.formatNumber(value, {
notation: 'compact',
compactDisplay: 'short'
});
}
Интеграция с React Intl:
import { useIntl } from 'react-intl';
function Stats({ value }) {
const intl = useIntl();
const formatted = intl.formatNumber(value, {
notation: 'compact'
});
return <span>{formatted}</span>;
}
Компактная нотация тесно связана с культурной интерпретацией чисел:
FormatJS делегирует эти различия Intl API, что позволяет избегать ручного управления суффиксами.
Несмотря на универсальность, компактная нотация имеет ограничения:
Компактная нотация часто комбинируется с другими форматами:
new Intl.NumberFormat('en', {
style: 'currency',
currency: 'USD',
notation: 'compact'
}).format(1200000);
// "$1.2M"
new Intl.NumberFormat('en', {
style: 'percent',
notation: 'compact'
}).format(0.153);
// "15%"
Создание Intl.NumberFormat — относительно дорогая
операция. В контексте FormatJS применяется кэширование:
const cache = new Map();
function getFormatter(locale) {
if (!cache.has(locale)) {
cache.set(locale, new Intl.NumberFormat(locale, {
notation: 'compact'
}));
}
return cache.get(locale);
}
Это особенно важно для высоконагруженных интерфейсов с частым ререндерингом.
При SSR важно синхронизировать локаль:
FormatJS обычно использует сериализацию Intl данных для согласованного рендеринга.
Поддержка notation: 'compact' появилась относительно
поздно, поэтому:
Компактная нотация выступает как слой визуальной оптимизации поверх локализованных числовых правил, позволяя выражать большие значения в краткой форме без потери семантической корректности в рамках выбранной локали.