Discussion:
[COBOL] IBAN-Prüfsumme berechnen
(zu alt für eine Antwort)
Volker Englisch
2016-03-24 09:41:51 UTC
Permalink
Ich versuche gerade, die Prüfsumme der Banken-IBAN zu berechnen. Ein
Beispiel im Netz führt dazu, dass aus der Zahlenfolge
700901001234567890131400 nach Modulo 97 ein Wert von 90 übrig bleiben
soll:

IDENTIFICATION DIVISION.
PROGRAM-ID. T.
AUTHOR. EH.
DATE-WRITTEN. 2016/03/24.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W-ZAHL PIC 9(24).
01 W-ERGEBNIS PIC 9(24)V999.
01 W-ERG-DEZ PIC 9(24).999.
01 W-MOD PIC 9(2).
PROCEDURE DIVISION.
MOVE 700901001234567890131400 TO W-ZAHL.
DIVIDE W-ZAHL BY 97 GIVING W-ERGEBNIS.
MOVE W-ERGEBNIS TO W-ERG-DEZ.
MOVE FUNCTION MOD(W-ZAHL, 97) TO W-MOD.
DISPLAY "ERGEBNIS NACH DIVISION: " W-ERG-DEZ.
DISPLAY "ERGEBNIS NACH MODULO : " W-MOD.
STOP RUN.

Heraus kommt:

ERGEBNIS NACH DIVISION: 007225783517882143197230.927
ERGEBNIS NACH MODULO : 57

Nach der Division durch 97 bleibt ein Rest von 927 - je nach Rundung
auf zweistellig bleibt 92 oder 93 übrig. Leider nicht 90, wie erwartet.
Die interne COBOL-Modulo-Funktion bringt ganz andere Werte zu Tage.

Erkennt jemand auf Anhieb meinen Denkfehler?

V*
Ulrich Korndoerfer
2016-03-24 11:30:00 UTC
Permalink
Hallo,
Post by Volker Englisch
Ich versuche gerade, die Prüfsumme der Banken-IBAN zu berechnen. Ein
Beispiel im Netz führt dazu, dass aus der Zahlenfolge
700901001234567890131400 nach Modulo 97 ein Wert von 90 übrig bleiben
IDENTIFICATION DIVISION.
PROGRAM-ID. T.
AUTHOR. EH.
DATE-WRITTEN. 2016/03/24.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 W-ZAHL PIC 9(24).
01 W-ERGEBNIS PIC 9(24)V999.
01 W-ERG-DEZ PIC 9(24).999.
01 W-MOD PIC 9(2).
PROCEDURE DIVISION.
MOVE 700901001234567890131400 TO W-ZAHL.
DIVIDE W-ZAHL BY 97 GIVING W-ERGEBNIS.
MOVE W-ERGEBNIS TO W-ERG-DEZ.
MOVE FUNCTION MOD(W-ZAHL, 97) TO W-MOD.
DISPLAY "ERGEBNIS NACH DIVISION: " W-ERG-DEZ.
DISPLAY "ERGEBNIS NACH MODULO : " W-MOD.
STOP RUN.
ERGEBNIS NACH DIVISION: 007225783517882143197230.927
ERGEBNIS NACH MODULO : 57
Nach der Division durch 97 bleibt ein Rest von 927 - je nach Rundung
auf zweistellig bleibt 92 oder 93 übrig. Leider nicht 90, wie erwartet.
Die interne COBOL-Modulo-Funktion bringt ganz andere Werte zu Tage.
700901001234567890131400 / 97 = 7225783517882143197230.927835051...
700901001234567890131400 mod 97 = 90
90 / 97 = 0.927835051...
--
Ulrich Korndoerfer

VB tips, helpers, solutions -> http://www.prosource.de/Downloads/
MS Newsgruppen Alternativen -> http://www.prosource.de/ms-ng-umzug.html
Volker Englisch
2016-03-24 14:54:34 UTC
Permalink
Hallo,

Ulrich Korndoerfer schrieb...
Post by Ulrich Korndoerfer
Post by Volker Englisch
Ich versuche gerade, die Prüfsumme der Banken-IBAN zu berechnen. Ein
Beispiel im Netz führt dazu, dass aus der Zahlenfolge
700901001234567890131400 nach Modulo 97 ein Wert von 90 übrig bleiben
700901001234567890131400 / 97 = 7225783517882143197230.927835051...
700901001234567890131400 mod 97 = 90
90 / 97 = 0.927835051...
Da lag wohl einerseits ein Problem der Definition von MOD in brain 1.0
vor, andererseits scheint die Intrinsic-Mod-Funktion des Compilers auch
nicht so zu passen. Jetzt funktioniert es (erstmal für DE-IBANs).

Danke!

IDENTIFICATION DIVISION.
PROGRAM-ID. IBAN.
AUTHOR. EH.
DATE-WRITTEN. 2016/03/24.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 W-ZAHL.
05 W-ZAHL-BLZ PIC 9(08).
05 W-ZAHL-KONTO PIC 9(10).
05 W-ZAHL-DE PIC 9(06) VALUE 131400.
01 W-ZAHL-RECHNEN PIC 9(24).
01 W-ERGEBNIS PIC 9(24).
01 W-ZURUECK PIC 9(24).
01 W-MODULO PIC 9(02).
01 W-PZ PIC 9(02).
01 W-IBAN.
05 W-IBAN-LAND PIC X(02).
05 W-IBAN-PZ PIC X(02).
05 W-IBAN-BLZ PIC X(08).
05 W-IBAN-KONTO PIC X(10).

PROCEDURE DIVISION.
DISPLAY "BANKLEITZAHL: " WITH NO ADVANCING.
ACCEPT W-ZAHL-BLZ.
DISPLAY "KONTONUMMER : " WITH NO ADVANCING.
ACCEPT W-ZAHL-KONTO.
MOVE W-ZAHL TO W-ZAHL-RECHNEN.
DIVIDE W-ZAHL-RECHNEN BY 97 GIVING W-ERGEBNIS.
MULTIPLY W-ERGEBNIS BY 97 GIVING W-ZURUECK.
SUBTRACT W-ZURUECK FROM W-ZAHL-RECHNEN
GIVING W-MODULO.
SUBTRACT W-MODULO FROM 98 GIVING W-PZ.
MOVE "DE" TO W-IBAN-LAND.
MOVE W-PZ TO W-IBAN-PZ.
MOVE W-ZAHL-BLZ TO W-IBAN-BLZ.
MOVE W-ZAHL-KONTO TO W-IBAN-KONTO.
DISPLAY "IBAN : " W-IBAN.
STOP RUN.

Lesen Sie weiter auf narkive:
Loading...