Минорные единицы валют представляют собой дробные части денежной
единицы, определяемые стандартом ISO 4217. Они задают точность
отображения и округления валютных значений в пользовательских
интерфейсах, финансовых отчётах и расчётах. В JavaScript через Intl API
эта логика встроена в механизм форматирования чисел при использовании
Intl.NumberFormat со стилем currency.
Каждая валюта может иметь собственную структуру деления на более мелкие единицы:
Минорные единицы фиксируются в стандарте ISO 4217 в поле minor unit, которое определяет количество знаков после запятой, используемых для представления валюты.
Ключевая особенность: количество знаков дробной части не является универсальным и зависит от конкретного кода валюты.
При использовании:
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD"
}).format(1234.56);
движок JavaScript автоматически подставляет параметры:
minimumFractionDigitsmaximumFractionDigitsна основе валютного кода.
Внутри алгоритма используется таблица соответствий ISO 4217, где каждая валюта имеет стандартное количество дробных знаков.
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD"
}).format(10);
Результат:
$10.00
Для евро:
new Intl.NumberFormat("de-DE", {
style: "currency",
currency: "EUR"
}).format(10);
10,00 €
Для иены:
new Intl.NumberFormat("ja-JP", {
style: "currency",
currency: "JPY"
}).format(10);
¥10
Отсутствие дробной части связано с тем, что у JPY минорные единицы равны 0.
Intl API использует валютный справочник, соответствующий ISO 4217, который определяет:
Некоторые примеры:
| Валюта | Код | Минорные единицы |
|---|---|---|
| Доллар США | USD | 2 |
| Евро | EUR | 2 |
| Японская иена | JPY | 0 |
| Бахрейнский динар | BHD | 3 |
| Кувейтский динар | KWD | 3 |
Эта таблица используется для вычисления параметров форматирования по умолчанию.
Intl.NumberFormat при style: "currency" автоматически
выставляет:
minimumFractionDigits = стандарт валютыmaximumFractionDigits = стандарт валютыПример:
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "BHD"
}).format(12.3);
Результат:
BD 12.300
Здесь видно использование трёх знаков после запятой, соответствующих спецификации валюты.
Разработчик может переопределить поведение через явную настройку:
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
minimumFractionDigits: 0,
maximumFractionDigits: 0
}).format(12.99);
Результат:
$13
Такое поведение используется для:
В финансовых системах часто используется «кассовое округление» (cash rounding), особенно в странах, где мелкие монеты отсутствуют.
Intl API не реализует cash rounding как отдельный режим, но позволяет имитировать его через настройку:
new Intl.NumberFormat("fi-FI", {
style: "currency",
currency: "EUR",
maximumFractionDigits: 0
}).format(1.99);
Результат:
2 €
При этом важно учитывать, что:
Опция currencyDisplay влияет на способ отображения
валютного символа, но не изменяет правила минорных единиц:
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
currencyDisplay: "name"
}).format(5);
Результат:
5.00 US dollars
Минорные единицы сохраняются, несмотря на текстовое представление валюты.
Некоторые валюты не используют минорные единицы вовсе:
Пример:
new Intl.NumberFormat("ko-KR", {
style: "currency",
currency: "KRW"
}).format(1234.56);
Результат:
₩1,235
Дробная часть полностью отбрасывается с округлением.
Существуют валюты с тремя и более знаками после запятой:
Пример:
new Intl.NumberFormat("ar-KW", {
style: "currency",
currency: "KWD"
}).format(12.3456);
Результат:
د.ك 12.346
Здесь видно округление до третьего знака, соответствующего спецификации валюты.
Помимо дробных знаков, Intl позволяет управлять значащими цифрами:
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
maximumSignificantDigits: 3
}).format(1234.56);
Результат:
$1,230
В этом режиме логика минорных единиц может быть частично игнорирована, так как приоритет получает значащая точность.
Алгоритм Intl для валютного форматирования включает несколько шагов:
Эта последовательность обеспечивает единообразие между платформами.
Несмотря на автоматизацию, существуют ограничения:
Пример криптовалюты:
new Intl.NumberFormat("en-US", {
style: "currency",
currency: "BTC"
}).format(0.123456);
Поведение зависит от реализации, так как BTC не входит в ISO 4217.
Локаль влияет на:
Но не влияет на количество минорных единиц.
Пример:
new Intl.NumberFormat("de-DE", {
style: "currency",
currency: "USD"
}).format(1234.5);
1.234,50 $
Минорные единицы остаются равными 2, несмотря на немецкий формат записи.
Минорные единицы критичны для:
Intl API обеспечивает базовую унификацию, но бизнес-логика часто расширяет поведение для: