私はしばらくの間この問題に固執しています。助けていただければ幸いです。
ファイルから4桁の数字を読み込んでいますが、内側の2桁を取得する必要があります。数値を文字列として読み込むのは良い考えだと思いました。次に、部分文字列の真ん中の2桁を取り、numval関数を使用してそれらを元に戻します。残念ながら、中の2文字を取得する方法がわかりません。
元。私は番号5465を持っています、私は46を取得したいです。
参照修飾を使用できます。次の点を考慮してください。
1 WS-MY-FIELD Pic X(4).
1 WS-TGT-FIELD Pic X(2).
...
Move WS-MY-FIELD (2:2) to WS-TGT-FIELD
最初の数字は開始位置 (1 ベース) を示し、2 番目の数字は長さを示します。
Keith Thompson が提案するものは問題なく機能します。I > 0 および J > 0 であることを確認したい場合があります。常に 1000 <= I <= 9999 であることがわかっている場合は問題ありません。
IBM Enterprise COBOL にはMOD 関数が含まれていますが、これはコンパイラーで使用できる場合と使用できない場合があります。
次のこともできると思います...
01 A-GROUP.
05 A-NUMBER PIC 9999 VALUE ZEROES.
05 A-STRING REDEFINES A-NUMBER.
10 FILLER PIC X.
10 THE-MIDDLE-TWO-DIGITS PIC XX.
10 FILLER PIC X.
MOVE your-number TO A-NUMBER.
これは、0 <= your-number <= 9999 の場合、your-number が COMP または COMP-3 として定義されているかどうかにかかわらず機能するはずです。
文字列ではなく数値として持っている場合は、算術的に行うことができます。が でI
あり、 に保存し5465
たい場合:46
J
DIVIDE I BY 10 GIVING J.
DIVIDE J BY 100 GIVING ignored REMAINDER J.
01 a-long-piece-of-data.
05 the-first-character pic x.
05 the-two-characters-we-want pic xx.
05 the-last-character pic x.
01 a-short-piece-of-data pic xx.
01 filler redefines a-short-piece-of-data.
05 a-short-unsigned-number pic 99.
MOVE the-two-characters-we-want TO a-short-piece-of-data
MOVE/ADD/COMPUTE/whatever a-short-unsigned-number
または MOVE a-short-piece-of-data TO どこでも
署名された番号を持っていて、署名を保持したいですか?
01 a-long-number PIC S9(4).
01 FILLER REDEFINES a-long-number.
05 FILLER PIC X.
05 an-integer-with-one-decimal-place PIC S99V9.
01 a-short-number-no-decimals PIC S99.
MOVE an-integer-with-one-decimal-place TO a-short-number-no-decimals