Prüfziffern IBAN berechnen

Hallo *,

ich habe gerade einmal naiverweise versucht, mit Calc die Prüfziffer für
ein IBAN-Konto zu errechnen. Das scheitert einfach daran, dass ich den
Rest einer 24-stelligen Zahl berechnen muss. Ich habe mich zuerst
gewundert, warum ich nie auf das entsprechende Ergebnis kam - bis ich
dahinter kam, dass aus den letzten Ziffern meiner 24-stelligen Zahl
lauter Nullen wurden.

Wenn ich das Ganze in Basic versuche schmeißt mich Basic mit der Meldung
"Überlauf" raus.

Vielleicht hat von Euch ja jemand noch einen (mathematischen) Tipp, wie
so etwas auch mit begrenzter Variablengröße gehen kann. Ansonsten habe
ich da schon das Programm konto_check in der Hinterhand.

Gruß

Robert

Hallo Robert,

ich habe gerade einmal naiverweise versucht, mit Calc die
Prüfziffer für ein IBAN-Konto zu errechnen.

Brauchst Du die Berechnung wirklich nur für das eine Konto? Vermutlich
willst Du auch weitere Bankverbindungen berechnen, oder?

Das scheitert einfach daran, dass ich den Rest einer 24-stelligen
Zahl berechnen muss. Ich habe mich zuerst gewundert, warum ich nie
auf das entsprechende Ergebnis kam - bis ich dahinter kam, dass aus
den letzten Ziffern meiner 24-stelligen Zahl lauter Nullen wurden.

Wenn ich das Ganze in Basic versuche schmeißt mich Basic mit der
Meldung "Überlauf" raus.

Vielleicht hat von Euch ja jemand noch einen (mathematischen) Tipp,
wie so etwas auch mit begrenzter Variablengröße gehen kann.

Einen direkten Tipp dazu leider nicht, allerdings kann ich Dir aus den
Banking-NGs als echten Fachmann auf diesem Gebiet, der sich schon
lange Jahre mit der Thematik befasst, Matthias Hanft mit seinen Seiten
zu Kontopruef etc. empfehlen. Da gibt es nämlich seeeehr viele
Stolpersteine - und mitunter häufige Änderungen/Ergänzungen bei den
Berechnungsmethoden für die verschiedenen Institute/Bankleitzahlen...

<http://www.hanft.de/>
<http://www.kontopruef.de/>

Wenn, dann kann er Dir vermutlich helfen.

Robert

.... und tschüss

            Franklin

Hallo Franklin,

ich habe gerade einmal naiverweise versucht, mit Calc die
Prüfziffer für ein IBAN-Konto zu errechnen.

Brauchst Du die Berechnung wirklich nur für das eine Konto? Vermutlich
willst Du auch weitere Bankverbindungen berechnen, oder?

Genau darum geht es. Falls jemand seine BLZ und Kontonummer weiß, dann
hoffte ich eben schnell die Prüfziffer ermitteln zu können.

Ich brauche dazu nicht irgendwelchen fachlichen Rat - berechnen könnte
ich das auch mit mit dem TI Nspire CX - der schafft diese Zahlengröße.
Deswegen sind für mich Vorschläge wichtig, wie ich so ein Problem auch
bei einer begrenzten Variablengröße umschiffen könnte.

Gruß

Robert

Hi Robert,

[IBAN-Prüfsumme berechnen - Zahl zu groß]
Wenn ich das Ganze in Basic versuche schmeißt mich Basic mit der Meldung
"Überlauf" raus.

Ja, das liegt an den Datentypen und der damit möglichen Genauigkeit
bei großen Zahlen in Calc.

Vielleicht hat von Euch ja jemand noch einen (mathematischen) Tipp, wie
so etwas auch mit begrenzter Variablengröße gehen kann.

Ja. Teile die Zahl in drei Zahlen auf, die innerhalb der Genauigkeit
liegen (12 signifikante Stellen)

Betrachte die komplette umgestellte IBAN als Text, um keine
Genauigkeit zu verlieren:
'210501700012345678131468 (das Beispiel aus Wikipedia) - darauf
achten, dass der Text keine Leerzeichen enthält)

dass kann man ja folgendermaßen darstellen:

LINKS(IBAN;8)*10^8*10^8 + TEIL(IBAN;9;8)*10^8 + RECHTS(IBAN;8)

Und jst ja erstmal egal, ob ein "hundertausenderrest" oder ein
Einerrrest übrig bleibt - das Prinzip ist dasselbe. (wenn es duch
97*10^8 teilbar ist, dann auch durch nur 97)

Also
=REST(
    REST(
        REST(
            LINKS(IBAN;8); 97
        )*10^8 + TEIL(IBAN;9;8); 97
    )*10^8 + RECHTS(IBAN;8); 97
)

Beachte, dass nur die Modulo berechnung noch nichts daüber aussagt,
dass das Konto auch tatsächlich existiert.

ciao
Christian

Hallo Robert,

guck dir mal diese Datei an:

http://hinzundkunzt-chor.de/LO/Iban2.ods

Ich hab das ganze noch nicht schön gemacht, aber bei meinen Konten kam bisher das richtige raus.
Der Trick ist, das ich den Rest stückweise berechnet habe, erst von der BLZ, danach von der Kontonummer.
Gruß
Ralf

Hallo Christian,

Ja. Teile die Zahl in drei Zahlen auf, die innerhalb der Genauigkeit
liegen (12 signifikante Stellen)

Betrachte die komplette umgestellte IBAN als Text, um keine
Genauigkeit zu verlieren:
'210501700012345678131468 (das Beispiel aus Wikipedia) - darauf
achten, dass der Text keine Leerzeichen enthält)

dass kann man ja folgendermaßen darstellen:

LINKS(IBAN;8)*10^8*10^8 + TEIL(IBAN;9;8)*10^8 + RECHTS(IBAN;8)

Und jst ja erstmal egal, ob ein "hundertausenderrest" oder ein
Einerrrest übrig bleibt - das Prinzip ist dasselbe. (wenn es duch
97*10^8 teilbar ist, dann auch durch nur 97)

Also
=REST(
    REST(
        REST(
            LINKS(IBAN;8); 97
        )*10^8 + TEIL(IBAN;9;8); 97
    )*10^8 + RECHTS(IBAN;8); 97
)

Genau so klappt es. Wolfgang hatte mir einen ähnlichen Vorschlag
(Aufteilen in kleinere Einheiten) per privater mai zukommen lassen.

Beachte, dass nur die Modulo berechnung noch nichts daüber aussagt,
dass das Konto auch tatsächlich existiert.

Ist schon klar. Das Ganze erstellt nur eine Prüfziffer zu einer
beliebigen vorherigen Ziffernfolge. Aber wenn ich da Leute habe, die
ihre Kontonummer und BLZ auswendig können, dann kann das schon helfen.
Und das ist ja wohl in der Übergangszeit häufiger der Fall.

Gruß

Robert

Ralf Albrecht schrieb:

http://hinzundkunzt-chor.de/LO/Iban2.ods

Die Datei gibt esnicht (mehr)!
Stellst du die bitte nochmal irgendwo online?

Danke,
Micha

Hallo Herbert,

ist Google:
IBAN aus Bankleitzahl und Konto-Nr. (482)

Aufgabe
Die International Bank Account Number, kurz IBAN genannt, ist eine
international standardisierte Nummer, welche jedes Girokonto in einem
der an diesem System teilnehmenden Länder eindeutig bezeichnet und
definiert.
Hier wird die Nummer für deutsche Konten bestimmt.

Lösung
In A1 steht die Bankleitzahl (8-stellig ohne Leerzeichen)
In A2 steht die Kontonummer (10-stellig ohne Leerzeichen; führende
Nullen können weggelassen werden - diese werden ergänzt)

A1: 30080000
A2: 0444566600
ergibt die IBAN: DE34300800000444566600

="DE"&TEXT((98-REST((62*(1+REST(A1;97))+27*REST(A2;97));97));"00")&A1&TEXT(A2;"0000000000")

und die Prüfung (die IBAN steht in B1):
=B1="DE"&TEXT((98-REST((62*(1+REST(TEIL(B1;5;8);97))+27*REST(RECHTS(B1;10);97));97));"00")&TEIL(B1;5;8)&TEXT(RECHTS(B1;10);"0000000000")
ergibt entweder WAHR oder FALSCH

Erläuterung
könnt Ihr hier kontrollieren:
http://www.iban.de/iban-berechnen.html
bzw. auf Eurem Kontoauszug

Hallo *,

ich habe gerade einmal naiverweise versucht, mit Calc die Prüfziffer für
ein IBAN-Konto zu errechnen. Das scheitert einfach daran, dass ich den
Rest einer 24-stelligen Zahl berechnen muss. Ich habe mich zuerst
gewundert, warum ich nie auf das entsprechende Ergebnis kam - bis ich
dahinter kam, dass aus den letzten Ziffern meiner 24-stelligen Zahl
lauter Nullen wurden.

Wenn ich das Ganze in Basic versuche schmeißt mich Basic mit der Meldung
"Überlauf" raus.

In Basic kannst Du mit LONG INTEGER nur maximal 9 signifikante Stellen
verwenden. Besser nimmst Du also DOUBLE mit 14 signifikanten Stellen.

Das sind zwar immer noch nicht die für eine BBAN notwendigen 24 (d. h.
international sogar max. bis zu 34) Stellen, aber es reicht aus, um die
Prüfsumme nach dem von Christian vorgeschlagenen Schema zu berechnen.

Ich würde allerdings das ganze noch etwas vereinfachen, und die BBAN
nicht einfach in 3 Blöcke a 8 Zahlen teilen, sondern einfach als die
drei Teile gleich die BLZ (10 Stellen), die Kontonummer (8 Stellen[1])
und das Länderkennzeichen samt den 2 Stellen für die Prüfziffer (6
Stellen) benutzen (ungeprüft):

DIM Bankleitzahl AS DOUBLE REM 8 Stellen nötig, max. 14 möglich
DIM Kontonummer AS DOUBLE REM 10 Stellen
DIM Laenderkennzeichen AS LONG REM 6 Stellen, da reicht LONG
DIM Pruefwert AS INTEGER REM 2 Stellen

   :

Pruefwert = ( _
              ( _
                ( _
                  (Bankleitzahl MOD 97) * 10^10 _
                ) + _
                (Kontonummer MOD 97) * 10^6 _
              ) + _
              (Laenderkennzeichen MOD 97) _
            )

[1] aber das gilt nur für DE; in AT ist die IBAN z. B. nur 20 Stellen
lang, in FR sogar 27; max. zulässig sind bis zu 32 Stellen (siehe
http://de.wikipedia.org/wiki/International_Bank_Account_Number#Zusammensetzung);
wie Du *das* implementieren willst, ist wohl eine ganz andere Frage ... :wink:

Wolfgang

Hallo *,

ich habe jetzt die unterschiedlichsten Reaktionen erhalten und zwei
direkt so umsetzen können, wie sie gekommen sind. Zum einen die Variante
von Christian, die mir am meisten einleuchtet (aufteilen des
Gesamtpaketes von 24 Ziffern in 3 Pakete von 8 Ziffern und nacheinander
berechnen - ist ähnlich wie die schriftliche Division in der Schule),
zum anderen der Weg, den Wilfried vorschlägt, der aus der Eingabe von
BLZ und Kontonummer ohne führende Nullen direkt die IBAN für DE erstellt.

Entscheidend für mich war und ist nicht, ob das jetzt tatsächlich eine
korrekte IBAN ist, die ich da errechne. Entscheidend ist vielmehr der
Gedanke, wie ich denn mit Ziffern rechnen kann, die eigentlich die
Verarbeitungsgröße von Calc und StarBasic und anderen
Programmiersprachen überschreiten. Das nehme ich jetzt dankbar als
Lernwert aus dieser Diskussion mit.

Gruß

Robert

Hallo Robert

Entscheidend für mich war und ist nicht, ob das jetzt tatsächlich eine
korrekte IBAN ist, die ich da errechne. Entscheidend ist vielmehr der
Gedanke, wie ich denn mit Ziffern rechnen kann, die eigentlich die
Verarbeitungsgröße von Calc und StarBasic und anderen
Programmiersprachen überschreiten. Das nehme ich jetzt dankbar als
Lernwert aus dieser Diskussion mit.

Bei Programmiersprachen (zumindest bei solchen, die diesen Namen auch verdienen ...) gibt's noch eine dritte Variante, und die hast Du eigentlich angedeutet: Du "verpackst" Deine Zahl in einen Array, der die richtige Anzahl Elemente enthält (also z.B. VAR IBAN = Array[1..34] of Byte in der Notation von Pascal/Delphi/Lazarus). Jetzt kannst Du damit tatsächlich genau so rechnen, wie man schriftlich und damit von Hand in der Schule rechnet. Ist ein bisschen aufwendiger, weil Du alle Operationen selber programmieren musst, aber dafür sind keinerlei Beschränkungen mehr gegeben. Auf diese Weise kannst Du theoretisch auch mit Zahlen mit tausenden von Stellen rechnen.

Freundlich grüsst

Ernst

Hallo Ernst, Robert, *

Bei Programmiersprachen (zumindest bei solchen, die diesen Namen auch
verdienen ...) gibt's noch eine dritte Variante, und die hast Du
eigentlich angedeutet: Du "verpackst" Deine Zahl in einen Array, der
die richtige Anzahl Elemente enthält (also z.B. VAR IBAN =
Array[1..34] of Byte in der Notation von Pascal/Delphi/Lazarus).
...
Auf diese Weise kannst Du theoretisch auch mit Zahlen mit tausenden
von Stellen rechnen.

Da fällt mir eine Geschichte aus meiner Schulzeit ein: Wir hatten einen
Computerraum mit insgesamt 4 Commodore CBM-8032. Einer unserer Lehrer
brachte den Spruch: Damit kann man einfache Programme schreiben, aber
große Berechnungen wie etwas 800! (800 Fakultät=800*799*798*...2*1)
gehen damit natürlich nicht mehr.

Ich sage nur Array, Multiplikationsschleife mit Überträgen, mehrere
Stunden Rechnezeit und BINGO! Das Teil hat immerhin 1977 Stellen.

Danach war er immer vorsichtig, wenn er unseren Rechnern unterstellen
wollte, das man damit irgendwas nicht berechnen könnte. ;-)))

Gruß,
Michael

Hallo

Bei Programmiersprachen (zumindest bei solchen, die diesen Namen auch
verdienen ...) gibt's noch eine dritte Variante, und die hast Du
eigentlich angedeutet: Du "verpackst" Deine Zahl in einen Array, der die
richtige Anzahl Elemente enthält (also z.B. VAR IBAN = Array[1..34] of
Byte in der Notation von Pascal/Delphi/Lazarus). Jetzt kannst Du damit
tatsächlich genau so rechnen, wie man schriftlich und damit von Hand in
der Schule rechnet. Ist ein bisschen aufwendiger, weil Du alle
Operationen selber programmieren musst, aber dafür sind keinerlei
Beschränkungen mehr gegeben. Auf diese Weise kannst Du theoretisch auch
mit Zahlen mit tausenden von Stellen rechnen.

Heutige "richtige" Programmiersprachen können mit *Integern* in der Grössenordnung bis zu 1000 Stellen problemlos umgehen, ohne irgendwelches Array-brimborium.
in Python z.b:

def check_iban( iban ):
     iban = iban.replace(' ','')
     iban = sum([ int(iban[4:])*10**6,
              (ord(iban[0].upper())-55)*10**4,
              (ord(iban[1].upper())-55)*10**2,
               int(iban[2:4]) ])
     return iban % 97 == 1

..> check_iban('DE68 2105 0170 0012 3456 78')
..> True

Werner

Hallo

in Python z.b:

def check_iban( iban ):
     iban = iban.replace(' ','')
     iban = sum([ int(iban[4:])*10**6,
              (ord(iban[0].upper())-55)*10**4,
              (ord(iban[1].upper())-55)*10**2,
               int(iban[2:4]) ])
     return iban % 97 == 1

..> check_iban('DE68 2105 0170 0012 3456 78')
..> True

Sorry, hier gings um die Prüfziffern - nicht um Validitäts-berechnung.
Dann:

def pruefsumme( iban ):
     iban = iban.replace(' ','')
     iban = sum([ int(iban[4:])*10**6,
              (ord(iban[0].upper())-55)*10**4,
              (ord(iban[1].upper())-55)*10**2,
               int(iban[2:4]) ])
     return '{:02d}'.format( 98 - iban % 97)

..> pruefsumme('DE00 2105 0170 0012 3456 78')

..> '68'

Sorry, ein kleiner Schreibfehler: Das I im Dateinamen auf dem Server war klein geschrieben.
Jetzt sollte beides funktionieren:

http://hinzundkunzt-chor.de/LO/iban2.ods
oder
http://hinzundkunzt-chor.de/LO/Iban2.ods

Gruß
Ralf

Meine IBANs wurden ebenfalls korrekt berechnet.

Stefan

Ralf Albrecht schrieb:

Jetzt sollte beides funktionieren:

Vielen Dank!

Micha