Валидатор IBAN
Четвертая программа реализует (в несколько упрощенной форме) алгоритм, используемый европейскими банками для указания номеров счетов. Стандарт под названием IBAN (международный номер банковского счета) предоставляет простой и достаточно надежный метод проверки номеров счетов по простым опечаткам, которые могут возникнуть при переписывании номера, например, из бумажных документов, таких как счета или чеки в компьютер.
Вы можете найти более подробную информацию здесь: https://en.wikipedia.org/wiki/International_Bank_Account_Number. р>
IBAN-совместимый номер счета состоит из:
- двухбуквенный код страны, взятый из стандарта ISO 3166-1 (например, FR для Франции, GB для Великобритании, DE для Германии и т.д.);
- две контрольные цифры, используемые для проверки достоверности - быстро и просто, но это не очень надежный тест, проверяющий, является число некорректным (искаженным опечаткой) или корректным;
- фактический номер счета (до 30 буквенно-цифровых символов - длина этой части зависит от страны).
Стандарт гласит, что проверка требует следующих шагов (согласно Википедии):
- (шаг 1) Проверьте правильность общей длины IBAN в соответствии со страной (эта программа этого не сделает, но Вы можете изменить код, чтобы он соответствовал этому требованию, если хотите; примечание: Вы должны научить программу длинам кодов всех стран, используемых в Европе);
- (шаг 2) Переместить четыре начальных символа в конец строки (т.е. код страны и контрольные цифры);
- (шаг 3) Заменить каждую букву в строке двумя цифрами, расширив тем самым строку, где A = 10, B = 11... Z = 35;
- (шаг 4) Интерпретировать строку как десятичное целое число и вычислить остаток от этого числа при делении на 97; Если остаток равен 1, тест контрольной цифры пройден и IBAN может быть верным.
Посмотрите на код в редакторе. Давайте проанализируем его:
- строка 03: попросить пользователя ввести IBAN (число может содержать пробелы, поскольку они значительно улучшают читабельность номера...
- строка 04: ... но удалить их);
- строка 05: введенный IBAN должен состоять только из цифр и букв - если это не так...
- строка 06: ... вывести сообщение;
- строка 07: IBAN не должен быть короче 15 символов (это самый короткий вариант, используемый в Норвегии);
- строка 08: если он короче, сообщить об этом пользователю;
- строка 09: кроме того, IBAN не может быть длиннее 31 символа (это самый длинный вариант, используемый на Мальте);
- строка 10: если он длиннее, вывести предупреждение;
- строка 11: начать фактическую обработку;
- строка 12: переместить четыре начальных символа в конец числа и преобразовать все буквы в верхний регистр (шаг 02 алгоритма);
- строка 13: это переменная, используемая для полного числа, созданная путем замены букв цифрами (в соответствии с шагом 03 алгоритма);
- строка 14: перебирать все символы IBAN;
- строка 15: если символ является цифрой...
- строка 16: просто скопировать ее;
- строка 17: в противном случае...
- строка 18: ... преобразовывать его в две цифры (обратите внимание, как это делается в примере);
- строка 19: преобразованная форма IBAN готова - сделайте из нее целое число;
- строка 20: остаток от деления
iban2
на97
равен1
? - строка 21: если да, то успех;
- строка 22: в противном случае...
- строка 23: ... номер недействителен.
Давайте добавим некоторые тестовые данные (все эти числа действительны - Вы можете сделать их недействительными, изменив любой символ).
- British:
GB72 HBZU 7006 7212 1253 00
- French:
FR76 30003 03620 00020216907 50
- German:
DE02100100100152517108
Если Вы являетесь резидентом ЕС, Вы можете использовать свой номер счета для тестов.
Code
# IBAN Validator.iban = input("Enter IBAN, please: ")
iban = iban.replace(' ','')
if not iban.isalnum():
print("You have entered invalid characters.")
elif len(iban) < 15:
print("IBAN entered is too short.")
elif len(iban) > 31:
print("IBAN entered is too long.")
else:
iban = (iban[4:] + iban[0:4]).upper()
iban2 = ''
for ch in iban:
if ch.isdigit():
iban2 += ch
else:
iban2 += str(10 + ord(ch) - ord('A'))
iban = int(iban2)
if iban % 97 == 1:
print("IBAN entered is valid.")
else:
print("IBAN entered is invalid.")