首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何计算国防部97?

我如何计算国防部97?
EN

Stack Overflow用户
提问于 2016-04-08 14:36:23
回答 1查看 7.8K关注 0票数 0

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

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

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

我现在要说的是:

注意:在这一步之前,我使用了一个指针来获取字符串中的数字,因此指针(减去1之后)包含了字符串的总长度。

代码语言:javascript
复制
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
           .

我有两个问题:

  1. 即使使用编译器中的ARITH(EXTEND)选项,COBOL也不能处理大于31位的数字字段,这是我的程序将要处理的。我的数字化字符串字段长度为66是有原因的。当我编译我的程序时,我会收到这样的消息:

由于中间结果的精度超过31位,可能会截断高阶数字位置。

  1. 当我的字符串计算字段(如上面所示)的长度比我从数字化字符串移到它的内容长时,空白由尾随零填补。这会影响计算。当我手动调整字符串-FOR-计算字段,使其与数字化字符串的内容完全相同时,计算就会进行得很好。

我只是不知道当我处理较短和更长的数字时,如何确保它的工作,我不得不把它分成几个部分。

附加信息:

我使用这个文档作为指南:www.bpfi.ie/wp-content/uploads/2014/10/MOD-97-Final-May-2013.pdf

但我不知道如何在COBOL做这件事。

此外,对于那些善意阅读和回答我以前的问题的人来说,这些领域不是国家的原因是因为我的项目经理改变了他的想法。现在,我所要做的就是使用MOVE FUNCTION NATIONAL-OF将IBAN-OUTPUT字段移到文案中。

更新

我正在使用COBOL/390编译器。

下面是我最后使用的代码:

代码语言:javascript
复制
WORKING-STORAGE SECTION.

01   DIGITIZED-STRING                  PIC X(66).
01   POINTER                           PIC S9(04)           COMP.

01   TEST-FIELDS.
            05  VERY-LONG-NUMBER.
                10  VLN-FIRST-PART     PIC 9(11).
                10  VLN-SECOND-PART    PIC 9(11).
                10  VLN-THIRD-PART     PIC 9(11).
                10  VLN-FOURTH-PART    PIC 9(11).
                10  VLN-FIFTH-PART     PIC 9(11).
                10  VLN-SIXTH-PART     PIC 9(11).
            05  EXPANDED-DIVIDEND                    PIC 9(13).
            05  FILLER
                REDEFINES EXPANDED-DIVIDEND.
                10  ED-REMAINDER                     PIC 99.
                10  ED-PART                          PIC 9(11).
            05  IRRELEVANT-ANSWER                    PIC 9(12).



PROCEDURE DIVISION.
MOVE SPACES TO TEST-FIELDS
           MOVE ZEROES TO TEST-FLDS
           MOVE DIGITIZED-STRING(1:POINTER)
                TO VERY-LONG-NUMBER(66 - POINTER + 1:POINTER)

               MOVE ZERO                    TO ED-REMAINDER
               MOVE VLN-FIRST-PART          TO ED-PART
               DIVIDE EXPANDED-DIVIDEND     BY 97
                 GIVING                     IRRELEVANT-ANSWER
                 REMAINDER                  ED-REMAINDER
               MOVE VLN-SECOND-PART         TO ED-PART
               DIVIDE EXPANDED-DIVIDEND     BY 97
                 GIVING                       IRRELEVANT-ANSWER
                 REMAINDER                    ED-REMAINDER
               MOVE VLN-THIRD-PART          TO ED-PART
               DIVIDE EXPANDED-DIVIDEND     BY 97
                 GIVING                       IRRELEVANT-ANSWER
                 REMAINDER                    ED-REMAINDER
               MOVE VLN-FOURTH-PART         TO ED-PART
               DIVIDE EXPANDED-DIVIDEND     BY 97
                 GIVING                       IRRELEVANT-ANSWER
                 REMAINDER                    ED-REMAINDER
               MOVE VLN-FIFTH-PART         TO ED-PART
               DIVIDE EXPANDED-DIVIDEND     BY 97
                 GIVING                       IRRELEVANT-ANSWER
                 REMAINDER                    ED-REMAINDER
               MOVE VLN-SIXTH-PART         TO ED-PART
               DIVIDE EXPANDED-DIVIDEND     BY 97
                 GIVING                       IRRELEVANT-ANSWER
                 REMAINDER                    ED-REMAINDER

           COMPUTE CHECK-DIGITS = 98
                   - ED-REMAINDER
           .
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-10 17:08:06

你就像“长队”一样。

代码语言:javascript
复制
1234 divided by 97 =
123 divided by 97, which gives x (doesn't matter for you) remainder 26
264 divided by 97, gives x, remainder 70

70是1234年中的97 .

下面是一个示例程序:

代码语言:javascript
复制
   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位数的6位数,每次13位数的股息。这将比尝试用更少的代码使用更长的数字更有效,使用编译器选项ARITH(EXTEND)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36502390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档