在一些其他语言中,可能常见的事情之一是"除以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-digits和five-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)"或类似名称,并且不要给它们带来误导性的名称.