На третьей и четвёртой позициях любого IBAN стоят контрольные цифры. Они вычисляются из всех остальных символов методом MOD 97-10, который описан в стандарте ISO/IEC 7064. Когда вы вводите IBAN, программа повторяет этот расчёт; если результат не сходится, в IBAN есть опечатка.
Проверка IBAN в четыре шага
Возьмём немецкий IBAN из примера DE89 3704 0044 0532 0130 00.
- Уберите пробелы:
DE89370400440532013000. - Перенесите первые четыре символа в конец:
370400440532013000DE89. - Замените каждую букву двумя цифрами: A = 10, B = 11 и так далее до Z = 35. Здесь D превращается в 13, а E в 14:
370400440532013000131489. - Разделите это число на 97 и возьмите остаток. Если остаток равен 1, IBAN верен.
В нашем примере 370400440532013000131489 при делении на 97 даёт в остатке ровно 1, значит, контрольные цифры верны.
Расчёт контрольных цифр
Чтобы получить контрольные цифры для нового IBAN, выполните те же шаги, поставив 00 на место контрольных цифр:
- Запишите код страны, затем
00и BBAN:DE00370400440532013000. - Переставьте символы и замените буквы, как описано выше:
370400440532013000131400. - Вычислите остаток от деления на 97. Здесь он равен 9.
- Вычтите остаток из 98: 98 − 9 = 89. Если нужно, дополните результат нулём до двух цифр (например, 7 превращается в 07).
Контрольные цифры равны 89, и получается DE89370400440532013000. Результат шага 4 всегда находится в диапазоне от 2 до 98, поэтому у правильного IBAN контрольные цифры никогда не бывают 00, 01 или 99.
Работа с длинными числами
Для Норвегии преобразованное число состоит из 17 цифр, для Германии из 24, а у мальтийского IBAN с буквами их больше 40. Обычно это слишком много для калькулятора или 64-битного целого числа, которое вмещает около 19 цифр. Число можно разбить на части: возьмите первые девять цифр, вычислите остаток, допишите его перед следующими цифрами и повторите:
| Шаг | Число | Остаток от деления на 97 |
|---|---|---|
| 1 | 370400440 | 23 |
| 2 | 23 + 5320130 = 235320130 | 70 |
| 3 | 70 + 0013148 = 700013148 | 38 |
| 4 | 38 + 9 = 389 | 1 |
Итоговый остаток равен 1, как и при делении всего числа сразу.
Та же проверка в коде
На JavaScript, по одной цифре за раз, так что большие числа не нужны:
function isValidIban(input) {
const iban = input.replace(/\s+/g, '').toUpperCase();
if (!/^[A-Z]{2}\d{2}[A-Z0-9]{11,30}$/.test(iban)) return false;
const rearranged = iban.slice(4) + iban.slice(0, 4);
let remainder = 0;
for (const ch of rearranged) {
const value = parseInt(ch, 36); // 0-9 stay digits, A-Z become 10-35
remainder = (value > 9 ? remainder * 100 : remainder * 10) + value;
remainder %= 97;
}
return remainder === 1;
}
На Python, где целые числа могут быть любой длины:
def is_valid_iban(value: str) -> bool:
iban = "".join(value.split()).upper()
if not (iban.isascii() and iban.isalnum() and 15 <= len(iban) <= 34):
return False
rearranged = iban[4:] + iban[:4]
digits = "".join(str(int(ch, 36)) for ch in rearranged)
return int(digits) % 97 == 1
Эти функции проверяют только структуру и контрольные цифры. Настоящий валидатор также проверяет, что страна пользуется IBAN и что длина соответствует этой стране. Длину для каждой поддерживаемой нами страны можно найти в статье Форматы IBAN по странам.
Чтобы проверить отдельный IBAN вручную, вставьте его в валидатор IBAN: он покажет, какая проверка не пройдена, а если неверны только контрольные цифры, подскажет подходящие. Если не хотите поддерживать этот код сами, воспользуйтесь iban-check, нашей библиотекой с открытым исходным кодом для JavaScript и TypeScript. Она выполняет все проверки по реестру IBAN SWIFT и не имеет зависимостей. Установка из npm: npm install iban-check.
Что обнаруживает проверка
Метод хорошо находит ошибки, которые люди допускают при наборе. Любая одна неверно набранная цифра и любая перестановка двух соседних цифр меняют остаток, поэтому такие ошибки обнаруживаются всегда. Другие ошибки проскальзывают примерно в одном случае из ста.
Существует ли счёт, проверка сказать не может. IBAN с верными контрольными цифрами может указывать на несуществующий код банка или на закрытый счёт. Поэтому IBAN из нашего генератора проходят проверку, хотя ни один банк их не выпускал.
Национальный контрольный ключ
Некоторые страны добавляют внутрь BBAN собственные контрольные цифры, вычисленные по национальным правилам. В итальянском IBAN BBAN начинается с буквы CIN, во Франции и Монако он заканчивается двузначным ключом «clé RIB», в Испании между кодом отделения и номером счёта стоят две контрольные цифры, а в Бельгии BBAN заканчивается двумя контрольными цифрами. Эти проверки не зависят от контрольных цифр IBAN: IBAN может пройти MOD-97 и при этом не пройти национальную проверку. Все национальные методы по странам разобраны в статье Национальные контрольные цифры в IBAN.
Источники
- ISO/IEC 7064: система контрольных символов MOD 97-10.
- ISO 13616-1:2020: как её применяет IBAN, включая замену букв числами (от A = 10 до Z = 35).
- Реестр IBAN SWIFT (SWIFT IBAN Registry): примеры IBAN и длина для каждой страны.