DanLevy.net

Международные номера и валюты

Локализованная валюта: разбор!

Деньги: Локализация (L10n) и интернационализация (i18n)

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

Валюта в неверном локальном формате — явный признак того, что вы не приложили усилий.
Если вы не умеете форматировать цены, как вы будете разбираться с доставкой?

Интернационализация — обширная тема, охватывающая всё: от перевода текстов до форматирования дат. В этой статье мы сосредоточимся на конкретном подпункте — форматировании чисел и валют.

Разберём форматирование на примерах трёх стран еврозоны, США и Индии:

Хаос! Согласны? Символы, пробелы и знаки препинания летают по всем направлениям! Удивительно, как ЕС вообще может договориться о чём-то! 😅

Ключевые понятия

Прежде чем переходить к решениям, разберёмся, что именно подразумевается под «Числа локальны»?

Числа локальны 🏘️

Каждая локаль (страна по стандарту ISO 3166) определяет собственные правила форматирования чисел.

Правила форматирования чисел включают:

Валюта глобальна 🌎

currency обозначает конкретную денежную единицу. (Список см. в ISO 4217.)

Когда важна локаль

Большинство REST API для e-commerce и платёжных систем оперируют парой price + currencyCode. Почему нет локалей?

Локали обычно задаются на уровне ОС/устройства, а браузеры предоставляют к ним доступ через navigator.language. Поскольку у каждого пользователя может быть своя локаль, логичнее всего форматировать числа и валюты на клиенте.

Решение

Хорошая новость: современные языки программирования поддерживают это из коробки. В JavaScript это класс Intl и Intl.NumberFormat.

Разберём пример:

const number = 1_234_567.89;
/**
* Format a number in local currency.
* @param {number} amount - The amount to format.
* @param {string} currency - The 3-letter currency code.
* @param {string} [locale] - The users locale string.
*/
const formatMoney = (amount, currency, locale = navigator.language) =>
new Intl.NumberFormat(locale, { currency, style: 'currency' })
.format(amount);
console.log('🇩🇪 ' + formatMoney(number, 'EUR', 'de-DE'));
console.log('🇮🇪 ' + formatMoney(number, 'EUR', 'ga-IE'));
console.log('🇫🇷 ' + formatMoney(number, 'EUR', 'fr-FR'));

Если потребуются более сложные операции — расчёт налогов, применение скидок или конвертация между валютами, стоит использовать специализированную библиотеку вроде dinero.js.

Дальнейшие шаги

В зависимости от ваших конкретных задач, может потребоваться изучить смежные темы:

Дайте знать, если хотите увидеть будущую статью по этим темам!