Skip to content

Страны и форматы ​

Откуда форматы ​

Таблица стран генерируется из метаданных libphonenumber — библиотеки Google, по которой номера проверяет Android. Для каждой страны берётся пример мобильного номера и его национальный формат без приставки: так номер пишут в самой стране.

28 стран из tinyval-mask сохраняют его форматы — +7 (999) 999-99-99, а не +7 999 999-99-99: при переходе с tinyval-mask на tinyval-phone ничего не меняется.

В бандл библиотека Google не попадает: в пакете только готовая таблица — код страны, шаблон и пара регулярных выражений.

ts
import { phoneTable } from 'tinyval-phone';

phoneTable.jp; // ['81', '99-9999-9999', '0']
phoneTable.bs; // ['1', '(999) 999-9999', '1', '242']
//               код, шаблон после кода, национальная приставка, признак страны

Номера разной длины ​

В некоторых странах номера бывают разной длины: в Германии мобильный — 10 или 11 цифр, в Австрии — от 8 до 13. Лишние цифры в шаблоне необязательные: +49 999 9999999[9]. Номер считается заполненным (complete), когда введена минимальная длина, — дальше можно дописать ещё цифры.

Страны с общим кодом ​

Один телефонный код бывает у нескольких стран: +1 — США, Канада и ещё 23 страны и территории (Багамы, Ямайка, Пуэрто-Рико…), +7 — Россия и Казахстан, +44 — Великобритания, Джерси, Гернси и остров Мэн. Страна определяется так:

  1. Берётся самый длинный подходящий код: +1242… — код 1, +375… — код 375.
  2. Если у страны есть «признак» и номер под него подходит — это она. Признак — начало номера (+1 242 — Багамы) или весь номер (+1 416 555 0123 — Канада: по коду города, когда номер введён полностью).
  3. Иначе — главная страна кода: +1 — США, +44 — Великобритания.

Пока номер Канады введён не полностью, показываются США — маска у них одинаковая, меняется только флаг. Номера Аландских островов, Ватикана, Шпицбергена, Кокосовых островов и ещё нескольких территорий не отличить от номеров Финляндии, Италии, Норвегии и Австралии — для них определяется главная страна, так же делает и libphonenumber.

ts
detectCountry('+1 201 555 0123'); // 'us'
detectCountry('+1 242 359 1234'); // 'bs'
detectCountry('+1 416 555 0123'); // 'ca'
detectCountry('+7 701 123 4567'); // 'kz'
detectCountry('+44 7797 712345'); // 'je'

Национальная приставка ​

Внутри страны перед номером часто набирают приставку: 8 в России, 0 в Британии и Германии, 06 в Венгрии. С defaultCountry её можно вводить — она отбрасывается, а код страны добавляется сам:

ts
mask('07400123456', phoneAuto({ defaultCountry: 'gb' })); // '+44 7400 123456'
mask('015123456789', phone('de'));                       // '+49 151 23456789'
mask('0612345678', phone('fr'));                         // '+33 6 12 34 56 78'

Свои страны и форматы ​

Формат страны можно поменять, страну — добавить или убрать: npx tinyval-phone countries копирует таблицу в проект, а setCountries подключает её. Подробно — Свои страны и флаги.

ts
import { setCountries } from 'tinyval-phone';

setCountries({ de: ['49', '9999 9999999[9]', '0'], xk: null });

Обновление данных ​

Номерные планы стран иногда меняются. В самом пакете таблица и флаги пересобираются из свежих libphonenumber-js и country-flag-icons командой npm run generate -w packages/tinyval-phone; тесты проверяют пример номера каждой страны.