DanLevy.net

Понимание международных чисел и валют

Локализованные деньги объяснены!

Money: Localization (L10n) and Internationalization (i18n)

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

Показ валюты в неверном локальном формате — верный признак: вы не приложили никаких усилий.
Если вы не можете отформатировать цену, как вы справитесь с доставкой?

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

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

Хаос! Верно? Символы, пробелы и знаки препинания летят во все стороны! Поразительно, как ЕС вообще может прийти к согласию! 😅

Critical Concepts

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

Numbers are Local 🏘️

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

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

Currency is Global 🌎

Валюта относится к конкретной денежной единице. (См. ISO 4217 для списка.)

When Locale Matters

Большинство REST API для электронной коммерции и платежей работают с price + currencyCode. Почему нет локалей?

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

A Solution

Хорошие новости! Современные языки программирования имеют встроенную поддержку этого. В 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.

Next Steps

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

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