Intl.NumberFormat представляет собой базовый механизм
локализованного форматирования числовых значений. Он используется для
преобразования чисел в строковое представление с учётом правил
конкретной локали: разделителей тысяч, десятичных знаков, валют,
процентов и единиц измерения.
Ключевая особенность — отделение логики отображения от бизнес-логики. Одно и то же число может иметь разные визуальные формы без изменения исходных данных.
const formatter = new Intl.NumberFormat('ru-RU');
formatter.format(1234567.89);
// "1 234 567,89"
Локаль ru-RU задаёт пробел как разделитель тысяч и
запятую как десятичный разделитель.
const usd = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD'
});
usd.format(99.99);
// "$99.99"
const rub = new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'RUB'
});
rub.format(99.99);
// "99,99 ₽"
Формат валюты зависит от стандартов ISO 4217 и локальных правил отображения.
const percent = new Intl.NumberFormat('en-US', {
style: 'percent'
});
percent.format(0.25);
// "25%"
Внутренне значение интерпретируется как доля от единицы.
const precise = new Intl.NumberFormat('en-US', {
minimumFractionDigits: 2,
maximumFractionDigits: 4
});
precise.format(12.3);
// "12.30"
precise.format(12.34567);
// "12.3457"
Параметры точности позволяют контролировать отображение без изменения исходной арифметики.
Intl.DateTimeFormat отвечает за локализованное
представление даты и времени. Он учитывает календарные системы, часовые
пояса и культурные нормы отображения времени.
const dtf = new Intl.DateTimeFormat('ru-RU');
dtf.format(new Date());
// "27.05.2026"
Формат зависит от локали и системных настроек.
const full = new Intl.DateTimeFormat('en-GB', {
dateStyle: 'full',
timeStyle: 'long'
});
full.format(new Date());
// "Wednesday, 27 May 2026 at 14:35:10 GMT+6"
const custom = new Intl.DateTimeFormat('ru-RU', {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric'
});
custom.format(new Date());
// "среда, 27 мая 2026 г."
const tz = new Intl.DateTimeFormat('en-US', {
timeZone: 'America/New_York',
timeStyle: 'short',
dateStyle: 'short'
});
tz.format(new Date());
Один и тот же момент времени отображается по-разному в зависимости от зоны.
Intl.ListFormat используется для корректного соединения
элементов списка с учётом грамматики языка.
const list = new Intl.ListFormat('en', { style: 'long', type: 'conjunction' });
list.format(['HTML', 'CSS', 'JavaScript']);
// "HTML, CSS, and JavaScript"
const disjunction = new Intl.ListFormat('en', { type: 'disjunction' });
disjunction.format(['Chrome', 'Firefox', 'Safari']);
// "Chrome, Firefox, or Safari"
const ruList = new Intl.ListFormat('ru', { type: 'conjunction' });
ruList.format(['яблоко', 'банан', 'груша']);
// "яблоко, банан и груша"
Форматирование учитывает союзы и пунктуацию конкретного языка.
Intl.PluralRules управляет выбором грамматической формы
в зависимости от числа.
const rules = new Intl.PluralRules('ru-RU');
rules.select(1);
// "one"
rules.select(2);
// "few"
rules.select(5);
// "many"
const ru = new Intl.PluralRules('ru-RU');
function formatApple(count) {
const forms = {
one: 'яблоко',
few: 'яблока',
many: 'яблок',
other: 'яблока'
};
return `${count} ${forms[ru.select(count)]}`;
}
formatApple(3);
// "3 яблока"
Механизм устраняет необходимость ручного написания сложных правил склонения.
Intl.RelativeTimeFormat формирует выражения вроде «3 дня
назад» или «через 2 часа».
const rtf = new Intl.RelativeTimeFormat('ru-RU');
rtf.format(-1, 'day');
// "1 день назад"
rtf.format(2, 'hour');
// "через 2 часа"
const compact = new Intl.RelativeTimeFormat('en', {
numeric: 'auto'
});
compact.format(-1, 'day');
// "yesterday"
Механизм применяет грамматические правила языка для построения естественных выражений времени.
Intl.Collator обеспечивает корректное лексикографическое
сравнение строк с учётом языка.
const collator = new Intl.Collator('ru');
['яблоко', 'арбуз', 'банан'].sort(collator.compare);
Результат сортировки соответствует правилам языка, а не Unicode-порядку.
const caseInsensitive = new Intl.Collator('en', {
sensitivity: 'base'
});
caseInsensitive.compare('a', 'A');
// 0
const natural = new Intl.Collator('en', {
numeric: true
});
['file1', 'file10', 'file2'].sort(natural.compare);
// ['file1', 'file2', 'file10']
Современные реализации Intl.NumberFormat поддерживают
форматирование физических величин.
const distance = new Intl.NumberFormat('en-US', {
style: 'unit',
unit: 'kilometer',
unitDisplay: 'long'
});
distance.format(5);
// "5 kilometers"
const speed = new Intl.NumberFormat('en-US', {
style: 'unit',
unit: 'kilometer-per-hour'
});
speed.format(120);
// "120 km/h"
Единицы стандартизированы и соответствуют Unicode CLDR.
Intl.Segmenter применяется для корректного разбиения
текста на слова или предложения с учётом языка.
const segmenter = new Intl.Segmenter('en', { granularity: 'word' });
[...segmenter.segment('Hello world')].map(s => s.segment);
// ["Hello", " ", "world"]
const sentenceSegmenter = new Intl.Segmenter('en', {
granularity: 'sentence'
});
[...sentenceSegmenter.segment('Hello. World!')].map(s => s.segment);
// ["Hello. ", "World!"]
Поддержка языков с различной структурой текста позволяет избегать ручных регулярных выражений.
Все компоненты Intl объединены общей моделью:
Форматтеры можно создавать один раз и переиспользовать:
const nf = new Intl.NumberFormat('ru-RU');
const df = new Intl.DateTimeFormat('ru-RU');
function render(price, date) {
return `${nf.format(price)} — ${df.format(date)}`;
}
Такой подход снижает накладные расходы при массовом форматировании данных.
const money = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD'
});
const date = new Intl.DateTimeFormat('en-US', {
dateStyle: 'medium'
});
function report(amount, timestamp) {
return `${money.format(amount)} (${date.format(timestamp)})`;
}
const number = new Intl.NumberFormat('ru-RU');
const rtf = new Intl.RelativeTimeFormat('ru-RU');
function stats(value, daysAgo) {
return `${number.format(value)} · ${rtf.format(-daysAgo, 'day')}`;
}
Архитектура Intl позволяет строить устойчивые к локализации системы представления данных без дублирования логики форматирования.