Hallo,
bin auf der Suche nach einer
schnellen IBAN-Validierung (für Massenverarbeitung) auf diesen Thread gestoßen. Da die bisherige Lösung nicht auf Schnelligkeit getrimmt war, habe ich dann doch selbst etwas programmiert. Für alle, die es interessiert:
Code:
// Prüfung einer IBAN auf formale Korrektheit (ohne Prüfung der Gültigkeit des Länderkürzels)
// Autor: Dr. Michael Schramm, Bordesholm
function checkIban(const sIban: String): boolean;
var k,i,n,len: integer; c: char;
buff: array[0..67] of char;
begin
result:= false;
n:= length(sIban);
if (n < 5) or (n > 34) then exit;
len:= 0; k:= 5;
repeat // IBAN als Ziffernfolge in geänderter Reihenfolge in buff schreiben
c:= sIban[k];
if (c >= '0') and (c <= '9') then begin
buff[len]:= c; inc(len)
end
else if (c >= 'A') and (c <= 'Z') then begin
i:= ord(c)-55;
buff[len]:= char(i div 10 + 48); inc(len);
buff[len]:= char(i mod 10 + 48); inc(len)
end
else exit;
inc(k);
if k > n then k:= 1
until k = 5;
i:= 0; // aktueller Rest für Modulo-Berechnung
for k:= 0 to len-1 do begin // modulo 97 berechnen
i:= (i * 10 + ord(buff[k]) - 48) mod 97;
end;
result:= (i = 1)
end;
Die Funktion erwartet die IBAN in kurzer Form, so wie sie z. B. in SEPA-
XML-Dateien auftritt. Falls die IBAN Leerzeichen enthält, müssen diese vor der Prüfung entfernt werden.
Grüße
Michael