国際的な口座番号を標準のIBAN構造に変換するプログラムを作成しています。MOD 97の計算方法
私はこれまで入力をチェックするプログラムを書いていましたが、その入力はスペースやゼロを埋め込まずに入力され、アルファベット文字の位置に対応する数字に変換され、 。
私がしなければならないことは、数値のMod 97を計算し、98から余りを減算することです。結果が1桁の場合、先行ゼロを挿入する必要があります。
は、私が今持っていることはこれです:
注:私は、このステップの前に文字列に番号を取得するためにポインタを使用するので、ポインタが(それから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(EXTEND)オプションで
- を、COBOLは、私のプログラムが扱っされる31桁、より大きな数値フィールドを処理することはできません。私は私のプログラムをコンパイルすると、私のデジタル化された文字列フィールドは、66の長さを持っている理由があり、私はこのメッセージが表示されます:
(上記見られるように)私のSTRING-FOR計算フィールドの長さが、私はデジタル化された文字列からに移動コンテンツより大きい場合「上位の桁位置の切り捨てが原因中間の精度 に発生する可能性があります結果は31桁を超えています。
-
がゼロを後にしてこれは計算に影響します。 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
.