Метод formatToParts() в семействах
Intl.NumberFormat и Intl.DateTimeFormat
возвращает не строку, а структурированное представление результата
форматирования в виде массива объектов. Каждый объект описывает
отдельный фрагмент итогового значения и содержит два ключевых поля:
type и value. Такая модель позволяет работать
с локализованным форматированием на уровне отдельных компонентов, а не
готовой строки.
Результат работы formatToParts() представляет собой
массив, где порядок элементов соответствует порядку символов в итоговой
строке форматирования.
Каждый элемент имеет вид:
{ type: string, value: string }
type — тип фрагмента (например, integer,
group, decimal, literal,
month, year)value — строковое представление части результатаТакой подход позволяет различать не только значения, но и их семантику внутри локализованного вывода.
Метод Intl.NumberFormat.prototype.formatToParts()
используется для разбиения числового форматирования на составные
элементы.
Пример:
const formatter = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD'
});
const parts = formatter.formatToParts(12345.67);
console.log(parts);
Результат:
[
{ type: 'currency', value: '$' },
{ type: 'integer', value: '12' },
{ type: 'group', value: ',' },
{ type: 'integer', value: '345' },
{ type: 'decimal', value: '.' },
{ type: 'fraction', value: '67' }
]
unit-формате)const formatter = new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'RUB'
});
const parts = formatter.formatToParts(987654.32);
const html = parts.map(part => {
if (part.type === 'currency') {
return `<span class="currency">${part.value}</span>`;
}
if (part.type === 'integer') {
return `<span class="int">${part.value}</span>`;
}
if (part.type === 'fraction') {
return `<span class="fraction">${part.value}</span>`;
}
return part.value;
}).join('');
Такой подход позволяет сохранять локализацию и при этом кастомизировать визуальное представление.
В отличие от разбиения строки через split, структура
formatToParts() учитывает особенности локали:
Метод Intl.DateTimeFormat.prototype.formatToParts()
возвращает структурированное представление даты и времени.
Пример:
const formatter = new Intl.DateTimeFormat('en-GB', {
dateStyle: 'full',
timeStyle: 'long'
});
const parts = formatter.formatToParts(new Date());
console.log(parts);
Возможный результат:
[
{ type: 'weekday', value: 'Monday' },
{ type: 'literal', value: ', ' },
{ type: 'day', value: '26' },
{ type: 'literal', value: ' ' },
{ type: 'month', value: 'May' },
{ type: 'literal', value: ' ' },
{ type: 'year', value: '2026' },
{ type: 'literal', value: ' at ' },
{ type: 'hour', value: '14' },
{ type: 'literal', value: ':' },
{ type: 'minute', value: '05' }
]
const formatter = new Intl.DateTimeFormat('ru-RU', {
year: 'numeric',
month: 'long',
day: 'numeric'
});
const parts = formatter.formatToParts(new Date());
const result = parts.map(part => {
if (part.type === 'day') {
return `[${part.value}]`;
}
return part.value;
}).join('');
Такой подход позволяет модифицировать только часть даты без разрушения локализации.
Обычный format() возвращает строку:
"12/31/2026"
formatToParts() возвращает структуру:
[
{ type: 'month', value: '12' },
{ type: 'literal', value: '/' },
{ type: 'day', value: '31' },
{ type: 'literal', value: '/' },
{ type: 'year', value: '2026' }
]
Ключевое различие заключается в том, что строка теряет информацию о структуре, тогда как части сохраняют её полностью.
Одна из особенностей formatToParts() — зависимость
структуры от локали:
Это делает невозможным корректный парсинг форматированной строки без
использования formatToParts().
При отображении финансовых таблиц важно выравнивание по числовым частям:
const formatter = new Intl.NumberFormat('de-DE', {
minimumFractionDigits: 2
});
const parts = formatter.formatToParts(1000000.5);
Далее можно отдельно стилизовать:
В интерфейсах, где важна типографическая точность,
formatToParts() позволяет:
literal может включать пробелы, символы пунктуации или
текстformatToParts() часто используется вместе с:
Intl.NumberFormat для финансовых и научных данныхIntl.DateTimeFormat для локализованных календарей и
таймзонIntl.RelativeTimeFormat косвенно, при ручной
постобработке строкПри этом именно разбиение на части позволяет сохранять корректность локализации при дополнительной обработке результата.
Массив частей можно рассматривать как поток токенов, где каждый элемент несёт семантический смысл:
Это делает возможной трансформацию результата без потери локализационной логики и без необходимости ручного анализа строки.