Wie IBAN-Nr. mit Python validieren?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Wenn du eine fertige IBAN hast z.B.

iban = "AT032011131006100841"

schneidest du zuerst die ersten vier Stellen (Land + Prüfsumme) ab:

land1 = iban[0]
land2 = iban[1]
pz = iban[2:3]
bban = iban[4:]

Jetzt ist bban = "2011131006100841"

Nun machst du aus "A" 10 und aus "T" 29 und hängst das mit der Prüfsumme hinten an:

land1num = ord(land1)-ord("A")+10
land2num = ord(land2)-ord("A")+10
ps = bban+ land1num+land2num+pz

Jetzt ist ps = "2011131006100841102903"

Wenn diese Zahl % 97 den Wert 1 ergibt, war die Prüfsumme richtig

if int(ps)%97 == 1: print "Bingo!"

Funktioniert auch für DE08700901001234567890

denn 700901001234567890131408 % 97 ist 1

Vgl.: https://www.iban.de/iban-pruefsumme.html

Hier wird nur die Prüfsumme validiert, nicht das Land und nicht die Länge!

Schachpapa  01.11.2018, 19:09

Sehe gerade, dass die IBAN von Frankreich und schweiz auch mittendrin Buchstaben enthalten können. Dann funktioniert es nicht ganz so einfach. Du musst erst jeden Buchstaben durch seinen 2-ziffrigen Code ersetzen. Anschließend schneidest du die ersten 6 Stellen vorn ab und hängst sie hinten an. Diese Zahl muss mod 97 den Wert 1 ergeben.

def validate(iban):
  ineu = ""
  for c in iban:
    if "A" <= c <= "Z":
        c = str(ord(c) - ord("A") + 10)
    ineu += c

  ineu = ineu[6:] + ineu[:6]
  return int(ineu) % 97 == 1

# muesste so gehen, noch prüfen ob die ersten beiden 
# Buchstaben DE CH oder FR sind
Jensek81 
Fragesteller
 01.11.2018, 21:25
@Schachpapa

Danke für die Antwort. Mhmm...also erstmal muckt der Interpreter, weil er die Variable IBAN nicht definiert ist, obwohl ich iban = AT030.... gesetzt habe. Liegt es daran, dass sowohl Zahlen als auch Buchstaben vermischt sind? Außerdem wird verlangt, dass man die IBAN gegebenfalls in die Konsole eingeben kann. Also darf ich die iBan doch gar nicht vorher definieren, oder?

Schachpapa  01.11.2018, 21:49
@Jensek81

Python unterscheidet Groß- und Kleinschreibung. iban und IBAN sind verschiedene Variablen.

Statt iban = "AT..." (mit Gänsefüßchen!) kannst du auch schreiben

iban = input("Geben Sie die IBAN ein")

Dann wird eine Eingabe von der Konsole abgefragt

Jensek81 
Fragesteller
 01.11.2018, 22:05
@Schachpapa

Ok, aber muss man nicht erstmal das so definieren, dass A = 10 und Z = 35 usw. Ich habe jetzt versucht die Codes zusammenzufügen, es kommt leider nichts sinnvolles raus.

letters_ = {"A": 10, "B": 11, "C": 12, "D": 13, "E": 14, "F": 15, "G": 16, "H": 17, "I": 18, "J": 19, "K": 20,

             "L": 21, "M": 22, "N": 23, "O": 24, "P": 25, "Q": 26, "R": 27, "S": 28, "T": 29, "U": 30, "V": 31,

             "W": 32, "X": 33, "Y": 34, "Z": 35,

             "0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9}

iban =DE68210501700012345678

land1 = iban[0]

land2 = iban [1]

pz = iban [2:3]

bban = iban [4:]

land1num = ord (land1) - ord ('A')+10

land2num = ord (land2) - ord ('A') + 10

ps = bban + land1num+land2num+pz

def validate (iban):

   ineu = ''

   for c in iban:

    if 'A' <= c <= 'Z':

        c = str(ord(c) - ord ('A') + 10)

    ineu += c

ineu = ineu[6:] + ineu [:6]

return int (ineu) % 97 == 1

if int (ps)% 97 == 1: print ('Validiert')

Schachpapa  01.11.2018, 22:19
@Jensek81

Nein nicht alles auf einmal. Es reicht der zweite Teil (def validate)

Wenn ihr noch keine Methoden gehabt habt, schreibst du statt

def validate(iban)

iban = input("Eingabe ...")

und sorgst dafür, dass der Teil danach richtig eingerückt ist.

Am Ende statt

return ...

if ...:

print("Korrekt")

else:

print ("Falsch")

#Also so:
iban = input("Eingabe bitte:")
ineu = ''
  for c in iban:
    if 'A' <= c <= 'Z':
        c = str(ord(c) - ord ('A') + 10)
    ineu += c
ineu = ineu[6:] + ineu [:6]
if int(ineu) % 97 == 1:
   print("Korrekt")
else:
   print("Falsch")
Jensek81 
Fragesteller
 01.11.2018, 23:01
@Schachpapa

Vielen dank. Tut mir leid, aber ich versteh es grade nicht so wirklich. Die 6 rührt daher, dass die BAN-Nr. ab der 6. Stelle loslegt? Weil ich muss ja noch irgendwo implementieren, dass die iBan nummern in Frankreich und schweiz anders aufgebaut sind (in der Schweiz sind es nur 21 zeichen, in Frankreich gibt's wohl noch einen sogenannten Bankbereich http://www.pruefziffernberechnung.de/I/IBAN.shtml.

Was steht in dem string der = ineu ist?

Schachpapa  02.11.2018, 06:50
@Jensek81

In ineu steht z.B. statt "AB1234Z567" "1011123435567". Es ist also die iban, in der die Buchstaben durch den 2-Ziffern-Code A="10"...Z="35" ersetzt wurden.

ineu[:6] sind die ersten 6 Zeichen, ineu[6:] ist der Rest ab dem 7. Zeichen (Die Zählung beginnt bei 0).

Wie die Nummern intern aufgebaut sind ist der Prüfsumme egal. Nur die wird hier geprüft.