从压缩十进制字段中分离数字

4

我有一个文件中的7位数压缩十进制字段。我该如何定义数据项来提取/分离这7个数字?

例如,我想在一个数据项中获取前两个数字,在另一个数据项中获取其他数字,以便稍后操作它们。


5
@Murad,你需要在标签上做出一些选择。如果JCL相关,则OpenCOBOL和COBOL.Net不相关。如果OpenCOBOL相关,则COBOL.Net不相关,反之亦然。 - Bill Woodger
@Murad:如果问题已经得到解答,请标记它或提供更多细节。 - Simon Sobisch
2个回答

5

在其他一些语言中,常见的做法可能是“除以10的倍数”,当然要选择适当的倍数。

但是,在COBOL中千万不要这样做。因为“除法”操作十分“昂贵”。

       05  input-packed-decimal 
                            PACKED-DECIMAL PIC 9(7).

然后:

       05  FILLER 
           REDEFINES input-packed-decimal.
           10  ipd-split-two-and-five
                            PACKED-DECIMAL PIC 99V9(5).

   01  two-digits                          PIC 99.
   01  five-digits                         PIC 9(5).
   01  FILLER
       REDEFINES five-digits.
       05  five-digits-as-decimals         PIC V9(5).

       MOVE ipd-split-two-and-five  TO two-digits
                                       five-digits-as-decimals

然后,您可以随意使用 两位数字五位数字

另一种方法:

   01  ws-input-seven                      PIC 9(7).
   01  FILLER 
       REDEFINES ws-input-seven.
       05  two-digits                      PIC 99.
       05  five-digits                     PIC 9(5).

       MOVE input-packed-decimal    TO ws-input-seven

第一种方法也适用于带符号的源字段(只需在每个PICture子句的适当位置放置一个S)。
第二种方法对带符号的字段不起作用,因为源符号不会传播到两位数字段,因为MOVE甚至不知道有这样一个字段存在。
当REDEFINES PACKED-DECIMAL或BINARY字段时要小心(在IBM Mainframe上,这些字段也可以使用COMP-3和COMP / COMP-4 / COMP-5)。始终在定义相同或类似的USAGE时定义相同数量的数字。对于REDEFINES字段,编译器始终假定您知道自己在做什么,因此它不会为您执行任何“源截断”。因此,在使用从属于REDEFINES的字段时,必须确保您明确或隐含地不期望源截断。
要获得第二个数字,请永远不要这样做:
       05  FILLER 
           REDEFINES input-packed-decimal.
           10  ignore-one-use-2nd-next-five
                            PACKED-DECIMAL PIC 9V9(5).

要获取第二个数字,仍需使用PACKED-DECIMAL PIC 99V9(5) ,但只需定义“接收”字段为一个数字位置即可。编译器会愉快地生成所期望的截断代码。
如果您“无法使用REDEFINES”,则必须在WORKING-STORAGE中创建一个具有与输入字段相同特征的新字段,并使用该字段。
此处使用的数据名称仅用于一般说明。请根据您的任务使用良好的描述性名称。如果前两位数字是零件类型,后五位数字是零件号,请确保命名清晰明了。
不要将它们命名为“Var(n)”或类似名称,并且不要给它们误导性的名称。

0

01 数组。

03  filler pic x(02) value '00'.

03  filler pic x(02) value '01'.

03  filler pic x(02) value '02'.

等等,直到...

03  filler pic x(02) value 'FF'.

01 两个数组重新定义为同一个数组。

03  harry occurs 256 pic x(02).

91 sub1。

03  filler pic x(01) value low-values.

93  sub1-byte2 pic x(01).

01 sub2重新定义sub1的计算。

01 pd pic x(04)。

01 pub pic 9(04)。

01 eggs。

03  eggs1 pic x(01).

03  eggs2 pic x(01).

执行变量 pub 的循环

从 1 开始,每次增加 1

直到 pub 大于 4

move pd(pub:1) to sub1-byte2

move harry(sub2 + 1) to eggs

display eggs1 egg2

end-perform.

因此,一个由256个2字节字段组成的数组,其值为“00”到“FF”。

遍历包含您打包十进制字段的4字节字段。

使用每个字节作为数组下标(加1以确保“00”指向数组中的第一个字段)。

指向的2字节字段具有表示打包十进制字段中该字节的2个半字节的值。

打包十进制字段中第四个字节的右半字节用于表示符号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接