Cobol子串;取一个4个字符的字符串并取内部2个字符

时间:2012-12-16 02:41:20

标签: string substring cobol

我一直坚持这个问题一段时间了。非常感谢帮助。

我从一个文件中读取了一个4位数字,我需要取两个内部数字。 我认为以字符串形式读取数字是一个好主意,然后在子字符串中取两个中间数字并使用numval函数将它们转换回来。不幸的是,我无法弄清楚如何获得内部两个字符。

实施例。    我有54​​65号,我想要46号。

4 个答案:

答案 0 :(得分:5)

Keith Thompson的建议会很好。您可能想检查我> 0和J>如果你总是知道1000< = I< = 9999,那就没问题了。

IBM Enterprise COBOL包含MOD function,您的编译器可能会也可能不会这样。

我认为你也可以做以下事情......

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< =您的号码< = 9999。

答案 1 :(得分: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),第二个数字表示长度。

答案 2 :(得分:3)

如果你把它作为一个数字而不是一个字符串,你可以用算术来做。鉴于I5465,并且您希望将46存储在J中:

DIVIDE I BY 10 GIVING J.
DIVIDE J BY 100 GIVING ignored REMAINDER J.

答案 3 :(得分: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