Cobol 如何进行MOD 97计算

Cobol 如何进行MOD 97计算,cobol,mainframe,Cobol,Mainframe,我正在写一个程序,将国际帐号转换成标准的IBAN结构 到目前为止,我已经成功地编写了一个程序来检查输入的有效性,将所说的输入串在一起而不嵌入空格或零,将字母字符转换成与其在字母表中的位置相对应的数字,并用这些数字创建一个字符串 现在我要做的就是计算这个数字的Mod 97,然后从98中减去余数。如果结果是一位数字,那么我必须插入一个前导零 我现在得到的是: 注意:在这一步之前,我使用了一个指针将数字输入到字符串中,因此指针(从中减去1)包含字符串的总长度 WORKING STORAGE SECTI

我正在写一个程序,将国际帐号转换成标准的IBAN结构

到目前为止,我已经成功地编写了一个程序来检查输入的有效性,将所说的输入串在一起而不嵌入空格或零,将字母字符转换成与其在字母表中的位置相对应的数字,并用这些数字创建一个字符串

现在我要做的就是计算这个数字的Mod 97,然后从98中减去余数。如果结果是一位数字,那么我必须插入一个前导零

我现在得到的是:

注意:在这一步之前,我使用了一个指针将数字输入到字符串中,因此指针(从中减去1)包含字符串的总长度

WORKING STORAGE SECTION.
01 WORK-FIELDS.
   05  HELP FIELDS.
       10  POINTER                PIC S9(04)           COMP.
       10  DIGITIZED-STRING       PIC X(66).
       10  STRING-FOR-CALCULATION PIC 9(31).

   05  IBAN.
       10 COUNTRY-CODE            PIC X(02).
       10 CHECK-DIGITS            PIC 9(02).
       10 BANK-CODE               PIC X(10).
       10 BRANCH-CODE             PIC X(10).
       10 ACCOUNT-NUMBER          PIC X(28).
       10 OUTPUT-IBAN             PIC X(34). 


PROCEDURE DIVISION.

SUBTRACT 1 FROM POINTER
           STRING DIGITIZED-STRING(1:POINTER)
                  DELIMITED BY SIZE
                  INTO STRING-FOR-CALCULATION
           EVALUATE TRUE
               WHEN POINTER < 32
                    COMPUTE IBAN-CHECK-DIGITS = 98
                    - FUNCTION MOD(STRING-FOR-CALCULATION, 97)
           END-EVALUATE
           .
你像“长除法”那样做

70是1234的mod 97

下面是一个示例程序:

   ID DIVISION. 
   PROGRAM-ID. STAB22. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   01  VERY-LONG-NUMBER                     PIC 9(8). 
   01  FILLER 
       REDEFINES VERY-LONG-NUMBER. 
       05  VLN-FIRST-PART                   PIC 9(4). 
       05  VLN-SECOND-PART                  PIC 9(4). 
   01  EXPANDED-DIVIDEND                    PIC 9(6). 
   01  FILLER 
       REDEFINES EXPANDED-DIVIDEND. 
       05  ED-REMAINDER                     PIC 99. 
       05  ED-PART                          PIC 9(4). 
   01  IRRELEVANT-ANSWER                    PIC 9(5). 
   01  VALUE-FOR-MOD-97      PACKED-DECIMAL PIC 99 VALUE 97.
   PROCEDURE DIVISION. 
       MOVE 1234                    TO VERY-LONG-NUMBER 
       MOVE ZERO                    TO ED-REMAINDER 
       MOVE VLN-FIRST-PART          TO ED-PART 
       DIVIDE EXPANDED-DIVIDEND     BY VALUE-FOR-MOD-97 
         GIVING                     IRRELEVANT-ANSWER 
         REMAINDER                  ED-REMAINDER 
       MOVE VLN-SECOND-PART         TO ED-PART 
       DIVIDE EXPANDED-DIVIDEND     BY VALUE-FOR-MOD-97 
         GIVING                     IRRELEVANT-ANSWER 
         REMAINDER                  ED-REMAINDER 
       DISPLAY ED-REMAINDER 
       MOVE 12345678                TO VERY-LONG-NUMBER 
       MOVE ZERO                    TO ED-REMAINDER 
       MOVE VLN-FIRST-PART          TO ED-PART 
       DIVIDE EXPANDED-DIVIDEND     BY VALUE-FOR-MOD-97 
         GIVING                     IRRELEVANT-ANSWER 
         REMAINDER                  ED-REMAINDER 
       MOVE VLN-SECOND-PART         TO ED-PART 
       DIVIDE EXPANDED-DIVIDEND     BY VALUE-FOR-MOD-97 
         GIVING                     IRRELEVANT-ANSWER 
         REMAINDER                  ED-REMAINDER 
       DISPLAY ED-REMAINDER 
       GOBACK 
       . 
结果是70和03

你可以推断。我建议你有六个11位数的部分,每次分红13位数。这将比使用编译器选项ARITH(EXTEND)以更少的代码尝试使用更长的数字更有效。

您可以像“长除法”一样进行操作

70是1234的mod 97

下面是一个示例程序:

   ID DIVISION. 
   PROGRAM-ID. STAB22. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   01  VERY-LONG-NUMBER                     PIC 9(8). 
   01  FILLER 
       REDEFINES VERY-LONG-NUMBER. 
       05  VLN-FIRST-PART                   PIC 9(4). 
       05  VLN-SECOND-PART                  PIC 9(4). 
   01  EXPANDED-DIVIDEND                    PIC 9(6). 
   01  FILLER 
       REDEFINES EXPANDED-DIVIDEND. 
       05  ED-REMAINDER                     PIC 99. 
       05  ED-PART                          PIC 9(4). 
   01  IRRELEVANT-ANSWER                    PIC 9(5). 
   01  VALUE-FOR-MOD-97      PACKED-DECIMAL PIC 99 VALUE 97.
   PROCEDURE DIVISION. 
       MOVE 1234                    TO VERY-LONG-NUMBER 
       MOVE ZERO                    TO ED-REMAINDER 
       MOVE VLN-FIRST-PART          TO ED-PART 
       DIVIDE EXPANDED-DIVIDEND     BY VALUE-FOR-MOD-97 
         GIVING                     IRRELEVANT-ANSWER 
         REMAINDER                  ED-REMAINDER 
       MOVE VLN-SECOND-PART         TO ED-PART 
       DIVIDE EXPANDED-DIVIDEND     BY VALUE-FOR-MOD-97 
         GIVING                     IRRELEVANT-ANSWER 
         REMAINDER                  ED-REMAINDER 
       DISPLAY ED-REMAINDER 
       MOVE 12345678                TO VERY-LONG-NUMBER 
       MOVE ZERO                    TO ED-REMAINDER 
       MOVE VLN-FIRST-PART          TO ED-PART 
       DIVIDE EXPANDED-DIVIDEND     BY VALUE-FOR-MOD-97 
         GIVING                     IRRELEVANT-ANSWER 
         REMAINDER                  ED-REMAINDER 
       MOVE VLN-SECOND-PART         TO ED-PART 
       DIVIDE EXPANDED-DIVIDEND     BY VALUE-FOR-MOD-97 
         GIVING                     IRRELEVANT-ANSWER 
         REMAINDER                  ED-REMAINDER 
       DISPLAY ED-REMAINDER 
       GOBACK 
       . 
结果是70和03

你可以推断。我建议你有六个11位数的部分,每次分红13位数。这将比使用编译器选项ARITH(EXTEND)使用更长的数字和更少的代码更有效

   ID DIVISION. 
   PROGRAM-ID. STAB22. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   01  VERY-LONG-NUMBER                     PIC 9(8). 
   01  FILLER 
       REDEFINES VERY-LONG-NUMBER. 
       05  VLN-FIRST-PART                   PIC 9(4). 
       05  VLN-SECOND-PART                  PIC 9(4). 
   01  EXPANDED-DIVIDEND                    PIC 9(6). 
   01  FILLER 
       REDEFINES EXPANDED-DIVIDEND. 
       05  ED-REMAINDER                     PIC 99. 
       05  ED-PART                          PIC 9(4). 
   01  IRRELEVANT-ANSWER                    PIC 9(5). 
   01  VALUE-FOR-MOD-97      PACKED-DECIMAL PIC 99 VALUE 97.
   PROCEDURE DIVISION. 
       MOVE 1234                    TO VERY-LONG-NUMBER 
       MOVE ZERO                    TO ED-REMAINDER 
       MOVE VLN-FIRST-PART          TO ED-PART 
       DIVIDE EXPANDED-DIVIDEND     BY VALUE-FOR-MOD-97 
         GIVING                     IRRELEVANT-ANSWER 
         REMAINDER                  ED-REMAINDER 
       MOVE VLN-SECOND-PART         TO ED-PART 
       DIVIDE EXPANDED-DIVIDEND     BY VALUE-FOR-MOD-97 
         GIVING                     IRRELEVANT-ANSWER 
         REMAINDER                  ED-REMAINDER 
       DISPLAY ED-REMAINDER 
       MOVE 12345678                TO VERY-LONG-NUMBER 
       MOVE ZERO                    TO ED-REMAINDER 
       MOVE VLN-FIRST-PART          TO ED-PART 
       DIVIDE EXPANDED-DIVIDEND     BY VALUE-FOR-MOD-97 
         GIVING                     IRRELEVANT-ANSWER 
         REMAINDER                  ED-REMAINDER 
       MOVE VLN-SECOND-PART         TO ED-PART 
       DIVIDE EXPANDED-DIVIDEND     BY VALUE-FOR-MOD-97 
         GIVING                     IRRELEVANT-ANSWER 
         REMAINDER                  ED-REMAINDER 
       DISPLAY ED-REMAINDER 
       GOBACK 
       .