Dieses benannte DOCUcontrol-Makro validiert die IBAN mittels Modulo 97-10
BOOL StrIsValidIBAN( STRING IBAN ) BOOL valid; INT ASCII, Length, i, Pos, Restwert; STRING Begin, Block, Sign; #DEBUG_START IBAN = "DE18 1203 0000 0012 3456 78"; #DEBUG_END IF( !StrIsEmpty( IBAN ) ) // nur, wenn Zeichenkette nicht leer ist StrRemove( IBAN, ' ' ); // alle Leerzeichen entfernen IF( StrIsAlnum( IBAN ) ) // nur, wenn die Zeichenkette jetzt aus alphanummerischen Zeichen besteht Length = StrGetLength( IBAN ); // die Länge des IBANs Begin = StrLeft( IBAN, 4 ); // die ersten 4 Zeichen IBAN = StrRight( IBAN, Length - 4 ); // die ersten 4 Zeichen entfernen StrInsert( IBAN, 34, Begin ); // die ersten 4 Zeichen hinten anhängen (max. Länge eines IBAN: 34 Zeichen) FOR( i=1; i<=Length; i++) // jedes Zeichen überprüfen Sign = StrMid( IBAN, i, 1); IF( StrIsAlpha( Sign )) // nur wenn Zeichen ein Buchstabe ist ASCII = StrGetAt( Sign ) - 55; // Zeichen D entspricht 13 (ASCII-Zeichen 68 - 55) StrReplace( IBAN, i, 1, IntToStr( ASCII ), 2 ); // Zeichen laut KONVERSIONSTABELLE FÜR ALPHAZEICHEN gegen Zahl ersetzen ENDIF // nur bei Buchstaben NEXT // jedes Zeichen überprüfen FOR( Pos=1; Pos<=Length; Pos=Pos+9 ) // Hilfsmethode für die Berechnung der Prüfziffer (9er-Blöcke) IF( Pos > 9 ) // erst ab dem 1. Durchgang StrInsert( IBAN, Pos, IntToStr( Restwert ) ); // Restwert in IBAN einfügen ENDIF Block = StrMid( IBAN, Pos, 9 ); // nächster Block Restwert = StrToInt( Block ) % 97; // Modulo 97 ermitteln Length = StrGetLength( IBAN ); // neue Länge (mit eingefügtem Restwert) des IBAN ermitteln Trace( "Block: %1 / Mod: %2 / IBAN-Länge: %3", Block, IntToStr( Restwert ), IntToStr( Length ) ); NEXT // nächser 9er-Block ENDIF // nur, wenn Zeichenkette aus alphanummerischen Zeichen besteht ENDIF // nur, wenn Zeichenkette nicht leer ist IF( Restwert == 1 ) // sofern die Prüfziffer korrekt ist muss der Restwert 1 ergeben valid = TRUE; ENDIF Trace( IBAN ); RETURN( valid );