В JavaScript интернационализация чисел строится вокруг механизмов,
которые позволяют отображать одни и те же числовые значения в различных
системах записи цифр. Ключевая роль здесь принадлежит объекту
Intl.NumberFormat, поддерживающему параметр
numberingSystem, а также расширениям локали вида
-u-nu.
В разных языках и культурах используются различные способы записи чисел. Даже при одинаковой математической сущности числа его визуальное представление может радикально отличаться:
В контексте Intl под системой счисления понимается не
математическая база, а графическая система представления
цифр.
По умолчанию большинство локалей используют систему:
latn
Она соответствует привычным арабским цифрам:
new Intl.NumberFormat('en-US').format(123456);
// "123,456"
Даже если явно не указано, большинство европейских и американских
локалей используют именно latn.
Intl.NumberFormat позволяет явно задавать систему цифр
через опцию numberingSystem.
new Intl.NumberFormat('ar-EG', {
numberingSystem: 'latn'
}).format(123456);
Результат:
123,456
При этом локаль арабского языка сама по себе может использовать другие символы, если не переопределять систему.
Одна из наиболее известных альтернативных систем:
new Intl.NumberFormat('ar-EG', {
numberingSystem: 'arab'
}).format(123456);
Результат:
١٢٣٬٤٥٦
Особенность заключается в том, что:
Система arabext используется в некоторых вариантах
арабских локалей и отличается более формализованными символами:
new Intl.NumberFormat('ar-EG', {
numberingSystem: 'arabext'
}).format(987654);
Результат:
٩٨٧٬٦٥٤
Различие между arab и arabext в деталях
типографики и исторически закреплённых стандартах отображения.
Используется в индийских языках, включая хинди:
new Intl.NumberFormat('hi-IN', {
numberingSystem: 'deva'
}).format(123456);
Результат:
१२३,४५६
Особенность системы:
new Intl.NumberFormat('bn-BD', {
numberingSystem: 'beng'
}).format(123456);
Результат:
১২৩,৪৫৬
Эта система используется в бенгальском языке и имеет собственный набор символов.
Китайская цифровая система отличается тем, что использует иероглифы для обозначения цифр:
new Intl.NumberFormat('zh-CN', {
numberingSystem: 'hanidec'
}).format(123456);
Результат:
一二三四五六
Особенность:
new Intl.NumberFormat('th-TH', {
numberingSystem: 'thai'
}).format(123456);
Результат:
๑๒๓,๔๕๖
Эта система широко используется в Таиланде наряду с латинской.
Система счисления может быть задана не только через параметр
numberingSystem, но и через расширение Unicode в строке
локали:
new Intl.NumberFormat('ar-EG-u-nu-arab').format(123456);
Здесь:
u — расширение Unicode;nu — ключ numbering system;arab — конкретная система цифр.Аналогично:
new Intl.NumberFormat('hi-IN-u-nu-deva').format(123456);
При форматировании чисел действует следующая логика:
numberingSystem в опциях — имеет наивысший
приоритет.-u-nu-... в локали —
используется он.latn.Чаще всего в движках JavaScript встречаются:
latn — латинскаяarab — арабскаяarabext — расширенная арабскаяthai — тайскаяdeva — деванагариbeng — бенгальскаяguru — гурмукхиhanidec — китайская десятичнаяkhmr — кхмерскаяmymr — бирманскаяtibt — тибетскаяПоддержка зависит от среды выполнения, но базовый набор стабилен в современных браузерах.
Система цифр влияет только на визуальное представление чисел, но не на:
Пример:
new Intl.NumberFormat('en-US', {
numberingSystem: 'thai'
}).format(1000000);
Результат:
๑,๐๐๐,๐๐๐
Числовая структура остаётся прежней, меняются только символы.
Системы счисления работают совместно с другими настройками:
new Intl.NumberFormat('hi-IN', {
numberingSystem: 'deva',
style: 'currency',
currency: 'INR'
}).format(1234.56);
new Intl.NumberFormat('ar-EG', {
numberingSystem: 'arab',
minimumFractionDigits: 2
}).format(12.5);
Intl не выполняет конвертацию систем счисления в
математическом смысле.Использование различных систем необходимо для:
Unicode-расширения позволяют объединять локаль и систему счисления в одном идентификаторе:
'hi-IN-u-nu-deva'
'ar-SA-u-nu-arab'
'th-TH-u-nu-thai'
Это делает поведение форматирования предсказуемым и декларативным без передачи дополнительных параметров в коде.