Коды валют ISO 4217

ISO 4217 — международный стандарт, определяющий систему кодов для представления валют. В JavaScript через Intl API эти коды используются как основной способ идентификации валют при форматировании чисел.

Каждый код валюты состоит из трёх букв:

  • первые две буквы — код страны по ISO 3166-1 alpha-2
  • третья буква — обычно первая буква названия валюты

Примеры:

  • USD — United States Dollar
  • EUR — Euro
  • GBP — British Pound
  • JPY — Japanese Yen
  • KZT — Kazakhstani Tenge

Такое представление обеспечивает однозначность и исключает конфликт названий валют между разными языками и регионами.

Основные особенности кодов ISO 4217

1. Универсальность идентификаторов

Коды не зависят от локализации. Независимо от языка интерфейса, USD остаётся USD, а EUR — EUR.

2. Поддержка дробных единиц

Большинство валют имеют фиксированное количество знаков после запятой:

  • USD — 2 знака (цент)
  • JPY — 0 знаков (иена не делится в международной практике)
  • KZT — 2 знака (тиын, хотя практически не используется)

3. Специальные коды

Помимо национальных валют существуют коды для:

  • XAU — золото
  • XAG — серебро
  • XDR — специальные права заимствования (IMF)
  • XXX — отсутствующая или неизвестная валюта

Эти коды начинаются с буквы X и используются в финансовых системах и биржевых данных.


Использование ISO 4217 в Intl.NumberFormat

В JavaScript форматирование валют реализуется через Intl.NumberFormat. Основной параметр — style: "currency", а также обязательное указание валютного кода ISO 4217.

Базовая структура:

new Intl.NumberFormat(locale, {
  style: "currency",
  currency: "USD"
});

Простейшее форматирование

const formatter = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD"
});

formatter.format(1234.56);
// $1,234.56
const formatterKZ = new Intl.NumberFormat("ru-KZ", {
  style: "currency",
  currency: "KZT"
});

formatterKZ.format(1234.56);
// 1 234,56 ₸

Форматирование зависит от локали, но валюта определяется исключительно ISO-кодом.


Параметр currencyDisplay

currencyDisplay управляет тем, как отображается валюта:

1. symbol (по умолчанию)

Используется символ валюты:

new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  currencyDisplay: "symbol"
}).format(100);
// $100.00

2. code

Отображается ISO-код:

new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  currencyDisplay: "code"
}).format(100);
// USD 100.00

3. name

Полное название валюты:

new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  currencyDisplay: "name"
}).format(100);
// 100.00 US dollars

4. narrowSymbol

Компактный символ (используется в ограниченных интерфейсах):

new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  currencyDisplay: "narrowSymbol"
}).format(100);

currencySign и бухгалтерский формат

Параметр currencySign влияет на отображение отрицательных значений.

standard

Обычное представление:

new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  currencySign: "standard"
}).format(-100);
// -$100.00

accounting

Бухгалтерский формат — отрицательные числа в скобках:

new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  currencySign: "accounting"
}).format(-100);
// ($100.00)

Этот формат широко используется в финансовых отчётах.


Тонкости работы с ISO 4217 в Intl API

1. Обязательность корректного кода

Если передан несуществующий код валюты:

new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "ABC"
});

возникает ошибка RangeError.

Intl API строго валидирует соответствие ISO 4217.


2. Автоматическое управление десятичными знаками

Каждая валюта имеет параметры:

  • minimumFractionDigits
  • maximumFractionDigits

Они автоматически задаются согласно стандарту.

Пример:

new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "JPY"
}).format(1234.56);
// ¥1,235

Дробная часть округляется, потому что японская иена не использует центы.


3. Локализация символов валют

Один и тот же ISO-код может отображаться по-разному:

new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "EUR"
}).format(100);
// €100.00
new Intl.NumberFormat("de-DE", {
  style: "currency",
  currency: "EUR"
}).format(100);
// 100,00 €

Позиция символа зависит от локали, а не от ISO-кода.


Таблица популярных кодов ISO 4217

Код Валюта Регион
USD US Dollar США
EUR Euro Еврозона
GBP Pound Sterling Великобритания
JPY Japanese Yen Япония
CNY Chinese Yuan Китай
KZT Tenge Казахстан
RUB Russian Ruble Россия

Работа с валютами с нестандартной точностью

Некоторые валюты требуют особого подхода:

JPY (0 знаков)

new Intl.NumberFormat("ja-JP", {
  style: "currency",
  currency: "JPY"
}).format(5000);
// ¥5,000

KWD (3 знака)

Кувейтский динар имеет три знака после запятой:

new Intl.NumberFormat("en-KW", {
  style: "currency",
  currency: "KWD"
}).format(12.345);
// 12.345 KWD

Intl API учитывает это автоматически.


Связь ISO 4217 и внутренних механизмов Intl API

Внутри Intl.NumberFormat валюта влияет на несколько аспектов форматирования:

  • выбор символа валюты
  • позиционирование (до или после числа)
  • правила округления
  • группировка разрядов
  • локальные пробелы и разделители
  • форма отрицательных значений

ISO 4217 выступает как ключевой идентификатор, который связывает все эти параметры в единую модель форматирования.


Поведение при неизвестной локали

Если локаль не поддерживает конкретную валюту, поведение остаётся корректным:

new Intl.NumberFormat("fr-FR", {
  style: "currency",
  currency: "USD"
}).format(100);
// 100,00 $US

Система использует запасные правила отображения.


Сравнение валютных представлений

Один и тот же ISO-код может давать разные результаты:

const value = 1234.56;

["en-US", "de-DE", "ja-JP"].forEach(locale => {
  console.log(
    new Intl.NumberFormat(locale, {
      style: "currency",
      currency: "EUR"
    }).format(value)
  );
});

Результат:

  • en-US → $1,234.56 (если USD) / €1,234.56
  • de-DE → 1.234,56 €
  • ja-JP → €1,234.56 (или локализованная форма)

Различие определяется локалью, а не кодом валюты.


Практическая модель использования ISO 4217

В реальных приложениях ISO 4217 используется как:

  • ключ в финансовых API
  • идентификатор в базах данных транзакций
  • параметр UI-форматирования
  • основа мультивалютных систем

Пример структуры данных:

const price = {
  amount: 1999.99,
  currency: "USD"
};

Отображение:

new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: price.currency
}).format(price.amount);

Валидация и безопасность данных

Использование ISO 4217 снижает риски:

  • исключает неоднозначные названия валют
  • предотвращает ошибки локализации
  • стандартизирует обмен данными между системами
  • обеспечивает совместимость с банковскими API

Intl API полагается на этот стандарт как на источник истины при форматировании валютных значений.