Локализация чисел, валют и дат
Форматирование влияет на восприятие и доверие к информации, особенно представленной в документации. Это простая вещь, но в ней есть нюансы.
Цель этой статьи — дать простое и понятное объяснение процесса локализации чисел, валют и дат в переведенных или изначально написанных на английском текстах. В качестве примеров используется наиболее популярная локаль 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-RU | en-US |
---|---|---|
Число | 1 234,567 | 1,234.567 |
Рубли | 1 234,56 ₽ | ₽1,234.56 |
Доллары | 1 234,56 $ | $1,234.56 |
В локали
en-US
у абсолютного большинства валют символ валюты ставится перед числом. Таблица выше показывает общий случай. В других локалях или при наличии определенных требований, таких как национальный стандарт, позиция символа относительно числа может быть иной.
Дата
Категория | ru-RU | en-US |
---|---|---|
Дата | 06.07.2024 | 7/6/2024 |
Дата и время | 06.07.2024, 14:30:00 | 7/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).