IBAN validieren

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 );