JavaScript имеет отличные возможности интернационализации. Одна из них - возможность форматировать числа для пользователей, не владеющих английским языком.

Это означает, что мы можем отображать числа для людей, использующих неанглийские языковые стандарты, без добавления для этого другой библиотеки. Мы можем форматировать числа с помощью конструктора Intl.NumberFormat. Конструктор принимает 2 аргумента.

Первый аргумент - это строка языкового стандарта или массив строк языкового стандарта. Строки локали должны быть языковыми тегами BCP 47 с необязательными расширениями ключей Unicode. У объекта, созданного конструктором, есть метод format, который принимает число, которое мы хотим отформатировать.

Конструктор и метод формата

Чтобы использовать конструктор Intl.NumberFormat, мы можем создать объект с помощью конструктора, а затем использовать метод format для вновь созданного объекта из конструктора для форматирования числа. Мы можем написать что-то вроде следующего кода:

console.log(new Intl.NumberFormat('en', {
  style: 'currency',
  currency: 'GBP'
}).format(222));

Приведенный выше код преобразует число 222 в сумму цены, выраженную в британских фунтах. Мы сделали это, передав параметр style со значением currency и свойство currency, установленное на GBP, что является символом валюты для британского фунта.

Конструктор Intl.NumberFormat принимает 2 аргумента, первый - аргумент локали, который принимает одну строку языкового стандарта или массив строк языкового стандарта. Это необязательный аргумент. Требуется языковой тег BCP 47 с дополнительным ключом расширения Unicode nu, чтобы указать систему нумерации для форматирования номера. Возможные значения для nu: "arab", "arabext", "bali", "beng", "deva", "fullwide", "gujr", "guru", "hanidec", "khmr", "knda", "laoo", "latn", "limb", "mlym", "mong", "mymr", "orya", "tamldec", "telu", "thai", "tibt".

Экземпляр объекта, созданного конструктором, имеет метод format, который возвращает строку с форматированным числом. Сокращенный список языковых тегов BCP 47 включает:

  • ar - арабский
  • bg - болгарский
  • ca - каталонский
  • zh-Hans - китайский, ханьский (упрощенный вариант)
  • cs - чешский
  • da - датский
  • de - немецкий
  • эль - Новогреческий (1453 г. и позже)
  • en - английский
  • es - испанский
  • fi - финский
  • fr - французский
  • он - иврит
  • hu - венгерский
  • is - исландский
  • it - итальянский
  • ja - японский
  • ко - корейский
  • nl - голландский
  • нет - норвежский
  • pl - польский
  • pt - португальский
  • rm - ретороманский
  • ro - румынский
  • ru - русский
  • hr - хорватский
  • sk - словацкий
  • sq - албанский
  • sv - шведский
  • th - тайский
  • tr - турецкий
  • ur - урду
  • id - индонезийский
  • uk - украинский
  • быть - белорусский
  • sl - словенский
  • et - эстонский
  • lv - латышский
  • lt - литовский
  • tg - таджикский
  • fa - персидский
  • vi - вьетнамский
  • hy - Армянский
  • аз - азербайджанский
  • eu - баскский
  • hsb - верхний сорбский
  • mk - македонский
  • tn - Тсвана
  • xh - коса
  • zu - зулусский
  • af - африкаанс
  • ка - грузинский
  • fo - фарерский
  • привет - хинди
  • mt - Мальтийский
  • se - северные саамы
  • ga - ирландский
  • ms - малайский (макроязык)
  • kk - казахский
  • кы - киргизский
  • sw - суахили (макроязык)
  • tk - туркменский
  • uz - узбекский
  • tt - татарский
  • bn - бенгальский
  • па - панджаби
  • гу - гуджарати
  • или - Ория
  • ta - тамильский
  • te - телугу
  • kn - каннада
  • мл - малаялам
  • as - ассамский
  • мистер - маратхи
  • sa - санскрит
  • mn - монгольский
  • бо - тибетский
  • cy - валлийский
  • km - Центральный кхмерский
  • lo - лаосский
  • gl - галисийский
  • кок - конкани (макроязык)
  • syr - сирийский
  • си - сингальский
  • iu - Инуктитут
  • am - амхарский
  • tzm - Центральный Атлас Тамазайт
  • ne - непальский
  • fy - западно-фризский
  • ps - пушту
  • fil - филиппинский
  • dv - Дивехи
  • ха - хауса
  • йо - Йоруба
  • quz - Куско кечуа
  • nso - Педи
  • ба - башкирский
  • lb - люксембургский
  • kl - Калааллисут
  • ig - игбо
  • II - Сычуань И
  • арн - Мапудунгун
  • мох - ирокез
  • br - бретонский
  • уг - уйгурский
  • mi - маори
  • oc - окситанский (пост 1500)
  • co - корсиканский
  • gsw - швейцарский немецкий
  • сах - якутский
  • qut - Гватемала
  • rw - киньяруанда
  • wo - Волоф
  • прс - Дари
  • gd - шотландский гэльский

Второй аргумент принимает объект с несколькими свойствами - localeMatcher, style, unitDisplay, _37 _, _ 38_, minimumIntegerDigits, minimumFractionDigits, maximumFractionDigits, minimumSignificantDigits и maximumSignificantDigits.

Параметр localeMatcher указывает используемый алгоритм сопоставления языкового стандарта. Возможные значения: lookup и best fit. Алгоритм поиска выполняет поиск языкового стандарта, пока не найдет тот, который соответствует набору символов сравниваемых строк. best fit находит языковой стандарт, который, по крайней мере, но возможно более подходящий, чем алгоритм lookup.

Параметр style указывает используемый стиль форматирования. Возможные значения для параметра style включают decimal, currency, percent и unit. decimal - это параметр по умолчанию, который используется для форматирования простых чисел, currency - для форматирования валюты, percent - для процентного форматирования, а unit - для форматирования unit.

Параметр currency предназначен для форматирования валюты. Возможные значения - коды валют ISO 4217, например USD для доллара США и EUR для евро. Нет значения по умолчанию.

Если для свойства style установлено значение currency, необходимо указать свойство currency.

Свойство currencyDisplay устанавливает способ отображения валюты в формате валюты. Возможные значения: symbol для добавления локализованного символа валюты, и это значение по умолчанию, code для добавления кода валюты ISO, name для использования локализованного названия валюты, например «доллар». Параметр useGrouping предназначен для установки разделителя группировки, используемого для чисел, это логическое значение.

minimumIntegerDigits, minimumFractionDigits и maximumFractionDigits считаются одной группой параметров. minimumIntegerDigits указывает минимальное количество используемых целых цифр в диапазоне от 1 до 21, причем 1 является параметром по умолчанию. minimumFractionDigits - минимальное количество цифр после дробной части в диапазоне от 0 до 20.

Значение по умолчанию - 0 для форматирования простых чисел и процентов. Значение по умолчанию для форматирования валюты указано в списке кодов валют ISO 4217 и 2, если оно не указано в списке. maximumFractionDigits - максимальное количество используемых цифр дробной части с возможными значениями от 0 до 20.

По умолчанию для простого числа установлено максимальное значение от minimumFractionDigits до 3. По умолчанию для форматирования валюты используется максимальное значение между minimumFractionDigits и количеством цифр дробной единицы, указанным в списке кодов валют ISO 4217, или 2, если список не предоставляет эту информацию. . По умолчанию процентное форматирование составляет максимум от minimumFractionDigits до 0.

minimumSignificantDigits и maximumSignificantDigits рассматриваются как другая группа опций. Если определена хотя бы одна из опций в этой группе, то первая группа игнорируется. minimumSignificantDigits - это минимальное количество используемых значащих цифр с возможными значениями от 1 до 21, значение по умолчанию - 1. maximumSignificantDigits - максимальное количество используемых значащих цифр, с возможными значениями в диапазоне от 1 до 21, по умолчанию - 21.

Некоторые примеры форматирования чисел включают требование минимального количества цифр для числа. Мы можем сделать это с помощью конструктора и метода format следующим образом:

console.log(new Intl.NumberFormat('en', {
  style: 'currency',
  currency: 'GBP',
  minimumIntegerDigits: 5
}).format(222));

Тогда мы получим 00 222,00 фунтов стерлингов, когда запустим функцию console.log в приведенном выше коде. Мы также можем указать минимальное количество десятичных знаков после десятичной точки с помощью параметра minimumFractionDigits, как в следующем коде:

console.log(new Intl.NumberFormat('en', {
  style: 'currency',
  currency: 'GBP',
  minimumFractionDigits: 2
}).format(222));

Тогда мы получим 222,00 фунта стерлингов, когда запустим функцию console.log в приведенном выше коде. Мы можем изменить группировку цифр с помощью параметра useGrouping, как в приведенном ниже коде:

console.log(new Intl.NumberFormat('hi', {
  style: 'decimal',
  useGrouping: true
}).format(22222222222));

Мы можем видеть, что получаем 22,22,22,22,222, когда регистрируем вывод кода выше. Локаль hi - это язык хинди, который форматирует числа иначе, чем английский, и мы можем видеть, что на хинди цифры сгруппированы в группы по 2, когда число больше одной тысячи.

Кроме того, мы можем форматировать числа в неарабские цифры. Например, если мы хотим отображать числа на китайском языке, мы можем установить параметр nu в качестве ключа расширения Unicode строки локали. Например, мы можем написать:

console.log(new Intl.NumberFormat('zh-Hant-CN-u-nu-hanidec', {
  style: 'decimal',
  useGrouping: true
}).format(12345678));

Затем мы регистрируем ‘一二, 三四五, 六 七八’. nu-hanidec указывает систему счисления, в которой мы хотим отображать отформатированное число. В приведенном выше примере мы указали, что в качестве системы счисления используется китайская система счисления, поэтому мы отображаем все цифры на китайском языке.

Другие методы

Помимо метода format, методы formatToParts и resolvedOptions также доступны в объекте, созданном конструктором Intl.NumberFormat. Метод formatToParts возвращает части отформатированного числа в виде массива. Метод resolvedOptions возвращает новый объект, который имеет параметры форматирования числа со свойствами, отражающими языковой стандарт и параметры сопоставления, которые вычисляются во время создания экземпляра объекта.

Чтобы использовать метод formatToParts, мы можем написать следующий код:

console.log(new Intl.NumberFormat('hi', {
  style: 'decimal',
  useGrouping: true
}).formatToParts(22222222222));

Тогда получаем:

[
  {
    "type": "integer",
    "value": "22"
  },
  {
    "type": "group",
    "value": ","
  },
  {
    "type": "integer",
    "value": "22"
  },
  {
    "type": "group",
    "value": ","
  },
  {
    "type": "integer",
    "value": "22"
  },
  {
    "type": "group",
    "value": ","
  },
  {
    "type": "integer",
    "value": "22"
  },
  {
    "type": "group",
    "value": ","
  },
  {
    "type": "integer",
    "value": "222"
  }
]

записывается, поскольку отформатированное число - 22,22,22,22,222, разбивается на части, помещается в массив и возвращается.

Чтобы использовать метод resolvedOptions, мы можем написать следующий код:

const formatOptions = new Intl.NumberFormat('hi', {
  style: 'decimal',
  useGrouping: true
}).resolvedOptions(22222222222)
console.log(formatOptions);

Это вернет:

{
  "locale": "hi",
  "numberingSystem": "latn",
  "style": "decimal",
  "minimumIntegerDigits": 1,
  "minimumFractionDigits": 0,
  "maximumFractionDigits": 3,
  "useGrouping": true,
  "notation": "standard",
  "signDisplay": "auto"
}

в выводе console.log. Приведенный выше код предоставит нам все параметры, которые мы использовали в формате, указанном выше числом 22222222222.

В JavaScript есть возможность форматировать числа для пользователей, не владеющих английским языком, с помощью конструктора Intl.NumberFormat. Это означает, что мы можем отображать числа для людей, использующих неанглийские языковые стандарты, без добавления для этого другой библиотеки. Мы можем форматировать числа с помощью конструктора Intl.NumberFormat. Конструктор принимает 2 аргумента.

Первый аргумент - это строка языкового стандарта или массив строк языкового стандарта. Строки локали должны быть языковыми тегами BCP 47 с необязательными расширениями ключей Unicode. Объект, созданный конструктором, имеет format метод, который принимает число, которое мы хотим отформатировать.

Он автоматически группирует цифры для разных языков, когда мы разрешаем группировку или можем отключить группировку, и мы можем указать количество отображаемых дробных, значащих цифр и целых цифр.