Международные номера и валюты
Локализованная валюта: разбор!
Деньги: Локализация (L10n) и интернационализация (i18n)
Они нужны не только для победы в Scrabble: локализация и интернационализация описывают процесс адаптации продукта так, чтобы он чувствовался родным в другой стране.
Валюта в неверном локальном формате — явный признак того, что вы не приложили усилий.
Если вы не умеете форматировать цены, как вы будете разбираться с доставкой?
Интернационализация — обширная тема, охватывающая всё: от перевода текстов до форматирования дат. В этой статье мы сосредоточимся на конкретном подпункте — форматировании чисел и валют.
Разберём форматирование на примерах трёх стран еврозоны, США и Индии:
€1,234,567.89Ирландия 🇮🇪1.234.567,89 €Германия 🇩🇪1 234 567,89 €Франция 🇫🇷$1,234,567.89США 🇺🇸₹12,34,567.89Индия 🇮🇳
Хаос! Согласны? Символы, пробелы и знаки препинания летают по всем направлениям! Удивительно, как ЕС вообще может договориться о чём-то! 😅
Ключевые понятия
Прежде чем переходить к решениям, разберёмся, что именно подразумевается под «Числа локальны»?
Числа локальны 🏘️
Каждая локаль (страна по стандарту ISO 3166) определяет собственные правила форматирования чисел.
Правила форматирования чисел включают:
- Дробная часть: запятая, точка.
- Разделитель тысяч: запятая, точка, пробел.
- Позиция и отступы символа валюты.
Валюта глобальна 🌎
currency обозначает конкретную денежную единицу. (Список см. в ISO 4217.)
- Определяет символ:
$,€,£,¥. (Часто переиспользуется.) - Всегда имеет трёхбуквенный код:
USD,EUR,GBP,JPY. - Может использоваться и обмениваться в «любой» стране. В теории.
- Конвертация между валютами требует данных о курсах обмена.
- Числовое значение не зависит от локали.
Когда важна локаль
Большинство 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.
Дальнейшие шаги
В зависимости от ваших конкретных задач, может потребоваться изучить смежные темы:
- Работа с локалью пользователя. Автоопределение + возможность переопределения. (например, выпадающий список стран.)
- Хранение целых чисел. (сохраняйте значения в центах, а не в долларах.)
- Арифметика с деньгами. (например, применение купона
скидка 20%, расчётsubTotal + налогии т. д.) - Курсы валют в реальном времени. (для розничных покупок, форекс-обменников.)
Дайте знать, если хотите увидеть будущую статью по этим темам!