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

Mur*_*rad 4 cobol cobol85 gnucobol cobol.net

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

例如,我希望一个数据项中的前两位数字和另一个数据项中的其他数字,所以我可以稍后操作它们.

Bil*_*ger 5

在一些其他语言中,可能常见的事情之一是"除以10的倍数",当然是适当的倍数.

但是,不要考虑使用COBOL."鸿沟"是"昂贵的".

       05  input-packed-decimal 
                            PACKED-DECIMAL PIC 9(7).
Run Code Online (Sandbox Code Playgroud)

然后:

       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
Run Code Online (Sandbox Code Playgroud)

然后你就可以使用two-digitsfive-digits任何你想要的东西.

其他方式:

   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
Run Code Online (Sandbox Code Playgroud)

第一种方法也适用于签名的源字段(只需将S放在每个PICture子句中的适当位置).

第二个不适用于带符号的字段,因为源符号不会传播到two-digits字段,因为MOVE甚至不知道存在这样的字段.

REDEFINESING PACKED-DECIMAL或BINARY字段时要小心(在IBM大型机上,这些字段也可以包含USAGE 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).
Run Code Online (Sandbox Code Playgroud)

要获得第二个数字,请像以前一样使用PACKED-DECIMAL PIC 99V9(5),但只能定位一个数字位置的接收字段.然后编译器会愉快地生成代码以执行您期望的截断.

如果您"无法使用REDEFINES",则必须在WORKING-STORAGE中创建一个与输入字段具有相同特征的新字段,然后使用它.

我在这里使用的数据名仅用于这个一般性解释.为您的任务使用好的,描述性的名称.如果前两个数字是部分类型,而后五个数字是部件号,请确保您的命名清晰.

不要将它们命名为"Var(n)"或类似名称,并且不要给它们带来误导性的名称.