1

我已经在这个问题上停留了一段时间。帮助将不胜感激。

我有一个从文件中读取的 4 位数字,我需要取里面的 2 位数字。我认为将数字作为字符串读取是个好主意,然后在子字符串中取中间两位数字并使用 numval 函数将它们转换回来。不幸的是,我不知道如何获得里面的两个字符。

前任。我有号码 5465,我想要 46。

4

4 回答 4

5

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.

无论您的号码被定义为 COMP 还是 COMP-3,只要 0 <= your-number <= 9999,这都应该有效。

于 2012-12-16T05:08:01.050 回答
5

您可以使用参考修改。考虑以下:

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 开始),第二个数字表示长度。

于 2012-12-17T01:11:43.943 回答
3

如果你把它作为一个数字而不是一个字符串,你可以用算术方法来做。鉴于这I5465,并且您想要存储46J

DIVIDE I BY 10 GIVING J.
DIVIDE J BY 100 GIVING ignored REMAINDER J.
于 2012-12-16T02:59:05.940 回答
0
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

或将一小段数据移动到任何地方

有签名号码并想保留该签名?

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
于 2012-12-24T19:07:18.003 回答