Длина идентификационного номера — первое, за что хватается проверка формы, и первое, на чём она ошибается. Универсального числа не существует: системы нумерации появлялись в разных странах в разное время и решали разные задачи, поэтому один номер укладывается в несколько цифр, а другой занимает больше десятка знаков и включает буквы. Ниже разберём, почему так вышло, чем номера различаются помимо длины и как построить проверку, которая не сломается на первой же незнакомой стране.
Почему единого стандарта не существует
Национальные номера выросли из местных реестров: где-то это налоговая служба, где-то перепись населения, где-то социальное страхование или регистр жителей. Международные стандарты описывают коды стран, регионов, валют и языков, но единого всемирного формата личного номера нет и никогда не было.
Разные источники означают разные правила. Номер, выданный налоговой службой, и номер из регистра жителей могут отличаться не только длиной, но и смыслом: один подтверждает обязанность платить налоги, другой фиксирует факт проживания. Для формы это означает, что подпись поля должна быть точнее слова «номер»: человеку важно понимать, какой именно идентификатор от него ждут, иначе он вставит не то значение, и никакая проверка длины его не спасёт.
Отсюда широкий разброс. Номер может быть чисто цифровым, а может смешивать буквы и цифры. Он может быть коротким или длинным. Из подтверждённых примеров: американский номер социального страхования состоит из девяти цифр; бразильский налоговый номер физлица — из одиннадцати, причём две последние цифры контрольные; канадский номер социального страхования — тоже из девяти цифр. Все остальные страны придётся описывать общими словами: у большинства длина где-то между коротким и длинным значением, и запоминать конкретные числа для каждой страны бессмысленно — их слишком много и они меняются.
Чем ещё различаются номера, кроме длины
Длина — самая заметная, но далеко не единственная характеристика. Если смотреть на номер как на строку, различаются сразу несколько свойств.
| Свойство | Каким бывает | Почему это важно для формы |
|---|---|---|
| Набор символов | только цифры или цифры с буквами | поле с числовым вводом отбросит буквы |
| Контрольные знаки | один, два или ни одного | от них зависит, можно ли ловить опечатки |
| Дата внутри номера | есть или нет | из номера нельзя автоматически выводить возраст |
| Разделители | пробелы, дефисы или ничего | оформление не должно попадать в хранимое значение |
| Алфавит букв | ограниченный или полный | часть букв специально исключают как похожие на цифры |
Взвешенная сумма с остатком от деления — распространённый способ вычисления контрольного знака. Такой знак обнаруживает опечатку и перестановку соседних символов, но не доказывает, что человек существует. Это ограничение стоит держать в голове и при проектировании сообщений об ошибках: «номер не найден» и «номер введён с ошибкой» — разные утверждения.
Может ли одна страна иметь несколько форматов?
Да, и это встречается чаще, чем ожидают. Номер, выданный двадцать лет назад, обычно остаётся действительным для своего владельца, даже если правила выдачи с тех пор изменились. Налоговый номер и номер регистра жителей могут сосуществовать как два разных идентификатора одной и той же страны. Иностранец или временный резидент иногда получает значение другой формы, чем постоянный житель.
Практический вывод простой: привязывать проверку к одному шаблону на страну рискованно. Правильнее держать для страны список допустимых форм и обновлять его, когда меняются правила, а не переписывать регулярное выражение целиком.
Что будет, если зашить длину в код?
Жёстко заданная длина даёт два вида ошибок, и второй опаснее первого. Первый — ложный отказ: форма отвергает корректный номер, потому что он не совпал с числом, которое кто-то когда-то вписал в проверку. Второй — ложное согласие: значение нужной длины проходит дальше, хотя не имеет никакого смысла, а иногда и вовсе обрезается или дополняется нулями при сохранении.
Особенно неприятна молчаливая нормализация. Если поле обрабатывается как число, ведущие нули исчезают, а если значения приводятся к фиксированной длине, лишние символы отбрасываются без предупреждения. Запись при этом выглядит правдоподобно, и найти причину расхождения потом очень трудно.
Ещё одна привычка, которая обходится дорого, — проверять значение до того, как из него убраны оформительские знаки. Пробелы, дефисы и точки, которые человек расставил для читаемости, не должны попадать в сохраняемое значение, но отклонять из-за них ввод нельзя. Сначала приведите строку к каноническому виду, и только потом применяйте правила страны: так разделители перестанут быть ошибкой, а значение останется чистым.
Как получить номер нужного формата
В генераторе данных личности выберите страну или регион — и вместе с именем, датой рождения и адресом получите номер документа в формате этой страны. Поля берутся из одной записи, поэтому номер не окажется от одной страны, а телефон от другой. Для России, например, отдельно показано, как выглядят поддерживаемые данные.
Сгенерированные значения синтетические и предназначены только для тестирования. Они не принадлежат ни одному человеку и не годятся для того, чтобы выдать себя за реального человека, пройти проверку личности или открыть настоящий счёт.
Что важно разработчику: длина, набор символов и запасной путь
Первое правило — не хранить длину как константу. Держите для каждой страны правило, а рядом — ветку для случая «формат неизвестен». Эта ветка должна не отклонять значение, а принимать его и сохранять без изменений: лучше пропустить незнакомый формат, чем потерять данные пользователя.
Второе — переключать проверку по стране выдачи, а не по одному глобальному шаблону. Смешанная проверка, которая подходит всем сразу, обычно не подходит никому: она либо слишком строгая, либо пропускает всё.
Отдельная ловушка — приведение к верхнему регистру «на всякий случай». Если буквы в номере зависят от регистра, такое преобразование незаметно меняет значение и делает запись недействительной. Если не зависят — преобразование безвредно, но полагаться на осторожность хуже, чем знать правило конкретной страны.
Третье — не путать контрольный знак с подтверждением личности. Там, где алгоритм опубликован, его стоит реализовать и проверять; там, где публикации нет, честнее помечать значение как соответствующее формату, а не делать вид, что оно проверено. Об этом же говорит разбор формата американского номера: даже у номера с жёсткой структурой проверка сообщает о записи, а не о человеке.
Четвёртое — подготовить тестовые случаи: слишком короткое значение, верная длина с буквами там, где ожидаются цифры, значение с контрольным знаком, посчитанным неверно, и значение, внутри которого закодирована дата. Последний случай связан с отдельной темой: если номер содержит дату рождения, из него легко вывести возраст, и о границах такого вывода рассказано в статье про крайние случаи даты рождения.
Что делать дальше
Возьмите свою форму и проверьте, как она ведёт себя на стране, для которой вы её не проектировали: чаще всего именно там обнаруживается, что поле рассчитано на один конкретный формат. Для набора примеров сгенерируйте записи в генераторе и добавьте к ним ветку «формат неизвестен» в проверку.