Локализация разделителей — один из ключевых аспектов международной типографики, который напрямую влияет на читаемость чисел, списков и сложных структур данных в интерфейсе. В экосистеме FormatJS работа с разделителями строится поверх стандартов ECMA-402 (Intl API) и данных CLDR, что позволяет учитывать культурные различия без ручного управления форматированием.
Числа в разных локалях используют различные символы для разделения целой и дробной части, а также групп разрядов. В одних языках десятичный разделитель — точка, в других — запятая. Аналогично различаются и групповые разделители тысяч.
const en = new Intl.NumberFormat('en-US');
const de = new Intl.NumberFormat('de-DE');
en.format(1234567.89); // "1,234,567.89"
de.format(1234567.89); // "1.234.567,89"
FormatJS использует тот же механизм через обёртки и компоненты, обеспечивая согласованность между сервером и клиентом.
import { FormattedNumber } from 'react-intl';
<FormattedNumber value={1234567.89} />
Вывод автоматически адаптируется под текущую локаль, включая:
Помимо чисел, критически важна локализация разделителей в списках. В английском языке используется конструкция с союзом “and”, в других языках — запятые, точки с запятой или иные правила.
const en = new Intl.ListFormat('en', { style: 'long', type: 'conjunction' });
const de = new Intl.ListFormat('de', { style: 'long', type: 'conjunction' });
en.format(['apples', 'bananas', 'oranges']);
// "apples, bananas, and oranges"
de.format(['Äpfel', 'Bananen', 'Orangen']);
// "Äpfel, Bananen und Orangen"
Разделитель между элементами списка не фиксирован и зависит от:
conjunction — перечисление с логическим «и» disjunction — альтернативы («или») unit — набор единиц измерения или технических значений
const orList = new Intl.ListFormat('en', { type: 'disjunction' });
orList.format(['red', 'green', 'blue']);
// "red, green, or blue"
В экосистеме FormatJS логика списков интегрируется через
react-intl.
import { FormattedList } from 'react-intl';
<FormattedList
value={['HTML', 'CSS', 'JavaScript']}
type="conjunction"
/>
Результат формируется в соответствии с локалью, включая правильные разделители и союзы.
В реальных интерфейсах числа и списки часто комбинируются с текстом. В таких случаях критично избегать ручной конкатенации строк, так как это ломает правила локализации.
const text = "Items: " + items.join(", ");
Такой подход фиксирует запятую как универсальный разделитель и игнорирует локаль.
const formatter = new Intl.ListFormat(currentLocale, {
style: 'long',
type: 'conjunction'
});
const text = formatter.format(items);
Числа, связанные с единицами измерения, требуют согласованного форматирования, где разделители играют роль визуального структурирования.
const speed = new Intl.NumberFormat('en-US', {
style: 'unit',
unit: 'kilometer-per-hour'
});
speed.format(120);
// "120 km/h"
В некоторых локалях формат может изменяться не только за счёт текста единицы, но и за счёт пробелов и разделителей между числом и символом единицы.
FormatJS опирается на CLDR (Common Locale Data Repository), где определяются:
Эти данные обеспечивают единообразие поведения во всех браузерах и средах выполнения.
Хотя стандартная логика покрывает большинство случаев, иногда требуется кастомное управление отображением.
const formatter = new Intl.NumberFormat('en-US');
formatter.formatToParts(12345.67);
Результат позволяет извлечь структуру числа:
[
{ type: "integer", value: "12" },
{ type: "group", value: "," },
{ type: "integer", value: "345" },
{ type: "decimal", value: "." },
{ type: "fraction", value: "67" }
]
Это позволяет:
Хотя основная тема касается чисел и списков, аналогичные принципы применяются к датам, где используются локализованные разделители между компонентами времени.
const date = new Intl.DateTimeFormat('de-DE');
date.format(new Date());
// "29.05.2026"
Разделители точек, слешей и пробелов также зависят от локали и следуют тем же принципам CLDR.
Различия между локалями часто касаются не только символов, но и логики:
Примеры:
new Intl.ListFormat('en-US').format(['A', 'B', 'C']);
// "A, B, and C"
new Intl.ListFormat('fr-FR').format(['A', 'B', 'C']);
// "A, B et C"
Одной из ключевых задач FormatJS является обеспечение единообразия разделителей во всех типах данных:
Это достигается через единый слой Intl и согласованную работу с CLDR, исключающую расхождения между компонентами интерфейса.