Стандарты и сертификаты · тема 3
9

Коды стран, валют, языков
и единицы величин

Страну, валюту, язык, номер телефона и размер файла в программах записывают по стандартам. Тогда данные из разных систем совпадают без ручной сверки. В главе разобраны коды ISO, формат телефонного номера E.164 и правила записи единиц величин.

Документы
ISO 3166-1 · ISO 4217 · ISO 639 · BCP 47 (RFC 5646) · ITU-T E.164 · ГОСТ 8.417-2002 · IEC 80000-13
Уровень
Базовый
Где встречается
Формы, базы данных, платежи, интерфейс на нескольких языках
Зачем это знать
Чтобы хранить такие данные однозначно

§1Страны и валюты

СтранаISO 3166-1 alpha-2alpha-3цифровойВалюта ISO 4217цифровой
РоссияRURUS643RUB643
КазахстанKZKAZ398KZT398
БеларусьBYBLR112BYN933
СШАUSUSA840USD840
ГерманияDEDEU276EUR978

Буквенный код валюты обычно складывается из кода страны и первой буквы названия валюты: RU + B (рубль). У евро код EUR, у Германии своей валюты нет. Названия стран меняются, коды — редко, поэтому в базе хранят код, а название показывают по нему.

Хранение страны и суммы

так не надо
order = {
    'country': 'Россия',
    'amount': 1490.9,
    'currency': 'руб.',
}
так надо
order = {
    'country': 'RU',
    'amount': '1490.90',   # строкой или Decimal
    'currency': 'RUB',
}

Справа код страны и валюты понятен любой системе. Сумму не хранят в float: 0.1 + 0.2 в нём не равно 0.3. Используют Decimal или целое число копеек.

Страница ISO 3166 на сайте ISO.
Страница ISO 3166 на сайте ISO. Полный перечень кодов ведёт ISO; в Python его даёт пакет pycountry.

§2Языки и локали

Язык обозначают двухбуквенным кодом ISO 639-1: ru, en, kk. Язык вместе с регионом — тегом по BCP 47 (RFC 5646): ru-RU, en-US, en-GB. Регион пишут прописными буквами, язык — строчными.

тег языка в HTML и в заголовке HTTP
<html lang="ru">

Accept-Language: ru-RU,ru;q=0.9,en;q=0.8

От локали зависит запись чисел и дат: в ru-RU — 1 490,90 и 07.10.2026, в en-US — 1,490.90 и 10/7/2026. Поэтому в хранилище и при обмене пишут нейтрально (1490.90, 2026-10-07), а локаль применяют только при показе человеку.

§3Телефонные номера, E.164

Рекомендация МСЭ-T E.164 задаёт международный формат номера: знак плюс, код страны и национальный номер, всего не больше 15 цифр, без пробелов и скобок.

Хранение телефона

так не надо
phones = ['8 (916) 123-45-67', '+7 916 1234567', '9161234567']
так надо
phones = ['+79161234567', '+79161234567', '+79161234567']

Слева три записи одного номера: поиск и проверка на повтор не сработают. Справа номер приведён к E.164, а пробелы и скобки добавляются только при показе.

приведение к E.164 пакетом phonenumbers
import phonenumbers

n = phonenumbers.parse('8 (916) 123-45-67', 'RU')
print(phonenumbers.format_number(n, phonenumbers.PhoneNumberFormat.E164))
# +79161234567

§4Единицы величин и запись чисел

В России единицы величин записывают по ГОСТ 8.417-2002, он основан на Международной системе единиц SI. Число и обозначение единицы разделяют пробелом, после обозначения точку не ставят.

ПравильноНеправильноПравило
5 км5км · 5 км.пробел перед единицей, без точки
20 °C20°C · 20 град.пробел перед °C
15 %15%по ГОСТ 8.417 перед знаком процента ставят пробел
30°30 °градус плоского угла пишут слитно
2 ч 15 мин2 час. 15 мин.ч, мин, с — без точек
1 500 0001,500,000 · 1.500.000разряды в русском тексте — пробелом
Килобайт и кибибайт.
Килобайт и кибибайт. Слева — десятичные приставки SI, справа — двоичные по IEC 80000-13.

По IEC 80000-13 приставка «кило» означает 1000 и в информатике: 1 кБ = 1000 байт. Для 1024 байт введены двоичные приставки: 1 КиБ (KiB) = 1024 байт, 1 МиБ = 1 048 576 байт. Поэтому диск «на 1 ТБ» в системе показывается как 931 ГиБ.

размер файла по-разному
size = 1_148_896          # байт, из журнала веб-сервера
print(size / 1000**2)     # 1.148896  -> 1,15 МБ
print(size / 1024**2)     # 1.0956... -> 1,10 МиБ

§5Частые ошибки

Хранить название страны вместо кодаНазвания меняются и пишутся по-разному; хранят RU.
Считать деньги во floatИспользуют Decimal или целые копейки.
Хранить телефон как ввёл пользовательПриводят к E.164: +79161234567.
Писать en-us или RU-ruЯзык строчными, регион прописными: en-US, ru-RU.
Называть 1024 байта килобайтомЭто кибибайт, КиБ; килобайт — 1000 байт.

§6Проверьте себя

  1. Какие коды у России по ISO 3166-1 и у рубля по ISO 4217?
  2. Чем тег ru-RU отличается от кода ru?
  3. Как записать номер 8 (916) 123-45-67 по E.164?
  4. Как по ГОСТ 8.417 записать «пять километров» и «двадцать градусов Цельсия»?
  5. Сколько байт в 1 кБ и в 1 КиБ?
КодыRU · RUS · 643RUB · USD · EURru-RU — BCP 47+7… — E.164
Единицы5 км — пробелбез точки после единицы15 % по ГОСТ 8.4171 500 000
БайтыкБ = 1000КиБ = 1024IEC 80000-131 ТБ ≈ 931 ГиБ

Справочник «Стандарты и сертификаты» · глава 9Макаров Максим Николаевич

Кадр