我正在編寫一個程序,將國際賬號轉換爲標準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個問題:
- 即使在編譯器中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
.