Опубликовано: :: Теги:

Локализация чисел, валют и дат

Форматирование влияет на восприятие и доверие к информации, особенно представленной в документации. Это простая вещь, но в ней есть нюансы.

Цель этой статьи — дать простое и понятное объяснение процесса локализации чисел, валют и дат в переведенных или изначально написанных на английском текстах. В качестве примеров используется наиболее популярная локаль en-US, а в качестве валют — доллары (USD).

Для веб-платформ существуют единые стандарты отображения данных:

  • Intl API в браузерах и JavaScript (часть стандарта ECMAScript).

  • Unicode CLDR (Common Locale Data Repository) - универсальный стандарт, лежащий в основе Intl API. Intl.NumberFormat, Intl.DateTimeFormat и другие компоненты этого API используют локализационные данные из Unicode CLDR.

Intl поддерживается всеми современными браузерами и по умолчанию применяется для локализации контента. За счет использования данных из Unicode CLDR этот механизм также обеспечивает соответствие национальным стандартам — ISO, ГОСТ и прочим.

Интерактивный пример

Для простоты при выборе локали предполагается, что в локали Ru валюта — это рубли, а в En — доллары. О некоторых особенностях форматирования валют в разных локалях рассказано далее.

Как форматировать числа, валюты и даты

Будут рассмотрены локали ru-RU и en-US. Подробнее о числах и валютах см. CLDR: Number and currency patterns, о датах — CLDR: Date/Time Patterns.

Числа и валюты

  • В ru-RU используется запятая как разделитель дробной части и пробел для тысяч.
  • В en-USточка для дробной части и запятая для тысяч.
  • Символ для обозначения валюты ставится перед числом без пробела в англоязычной среде, а в русскоязычной — после и с пробелом.
Категорияru-RUen-US
Число1 234,5671,234.567
Рубли1 234,56 ₽₽1,234.56
Доллары1 234,56 $$1,234.56

В локали en-US у абсолютного большинства валют символ валюты ставится перед числом. Таблица выше показывает общий случай. В других локалях или при наличии определенных требований, таких как национальный стандарт, позиция символа относительно числа может быть иной.

Дата

Категорияru-RUen-US
Дата06.07.20247/6/2024
Дата и время06.07.2024, 14:30:007/6/2024, 2:30:00 PM
Дата
(строковый формат)
6 июля 2024 г.July 6, 2024

В en-US:

  • Нули в начале числового кода дня и месяца пропускаются.
  • Обязателен пробел между числом и AM/PM. 2:30 PM — правильно, 2:30PM — неправильно.
  • Для большей точности в локализованных строках можно добавлять обозначения PDT (Pacific Daylight Time) и PST (Pacific Standard Time), являющиеся аналогами летнего и зимнего времени. PDT это часовой пояс UTC−7, PST — UTC-8. Мне никогда не приходилось применять их, но об их существовании полезно знать.

Работа с датами: универсальный формат для хранения и передачи

Для работы с API и в других случаях, когда нужно обеспечить машиночитаемость, не должны использоваться локализованные строки из примеров выше. Вместо них рекомендуется использовать даты, соответствующие ISO 8601 в UTC:

2024-07-06T14:30:00Z

Расшифровка:

ЧастьЗначениеПояснение
2024ГодЧетырёхзначный год
07МесяцИюль (всегда двузначный: 01–12)
06День6-е число месяца (01–31)
-РазделительСтатический разделитель года, месяца и дня
TМаркер времениОбозначает начало временной части (от Time)
14Часы14 часов в 24-часовом формате (2:30 PM)
30Минуты30 минут
00Секунды00 секунд
ZВременная зонаОбозначает UTC (Zero offset, нулевое смещение)

Последняя буква Z, обозначающая временную зону, применяется для указания времени по Гринвичу, то есть в часовом поясе UTC+0. В других временных зонах нужно явно указывать смещение в часах и минутах в форматах +HH:MM или -HH:MM.

Примеры:

  • 2024-07-06T14:30:00Z — UTC+0 (Гринвич);
  • 2024-07-06T17:30:00+03:00 — то же самое время, но в часовом поясе Москвы (UTC+3);
  • 2024-07-06T07:30:00-07:00 — то же самое время, но в часовом поясе Нью-Йорка, Лос-Анжелеса или Торонто (UTC-7).