2016-04-08 88 views
0

我正在編寫一個程序,將國際賬號轉換爲標準IBAN結構。我如何做MOD 97計算

我到目前爲止設法編寫一個程序,檢查輸入的有效性,字符串表示輸入在一起沒有嵌入空格或零,將字母字符轉換爲與他們在字母表中的位置相對應的數字,並創建一個字符串與這些數字。

現在我所要做的就是計算數字上的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 
      . 

我有2個問題:

  1. 即使在編譯器中ARITH(延伸)選項,COBOL無法處理數字領域超過31個位數大,這些我的程序將被處理。是有原因的數字化過程我的字符串字段具有66的長度當我編譯我的程序,我得到這樣的信息:

「高階數位位置的截斷,可能會發生由於中間精密度 結果超過31位數「。

  • 當我的STRING-FOR-計算字段的長度(如上所見)大於餘移動到它從數字化的字符串的內容越長,間隙中填充通過追蹤零。這會影響計算。當我手動將STRING-FOR-CALCULATION字段調整爲與DIGITIZED-STRING的內容完全一樣長時,計算進行得很順利。
  • 我只是不知道如何確保它在我處理更短和更長的數字時工作,這些數字我必須分成幾部分。

    附加信息:

    我使用這個文件作爲指導:www.bpfi.ie/wp-content/uploads/2014/10/MOD-97-Final-May-2013.pdf

    但我不知道如何做到這一點的COBOL。

    此外,對於那些善意閱讀和回答我以前的問題的人,這些領域不是國家的原因是因爲我的項目經理改變了他的想法。現在我所要做的就是使用MOVE FUNCTION NATIONAL-OF將IBAN-OUTPUT字段移動到副本。

    UPDATE

    我使用COBOL/390編譯器。

    下面是我最後使用的代碼:

    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 
          . 
    

    回答

    2

    你不喜歡它「長除法」。

    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下面是一個例子程序:

    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)以更少的代碼使用更長的數字更有效。