2016-04-08 17 views
0

国際的な口座番号を標準の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)オプションで

  1. を、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

    の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桁の6つの部分があり、毎回13桁の配当をすることをお勧めします。これはコンパイラー・オプションARITH(EXTEND)を使用して、より少ないコードでより長い数値を使用しようとするよりも効率的になります。