我想问一下,如何将文本中的数字移动,例如:01 A PIC X(6)值“200030”,以及01 B PIC 9(6)等数字,我只想提取第一个A的数量为A.在Cobol中禁止使用MOVE进行此类移动,我使用的移动是将A(1:4)移动到B。
答案 0 :(得分:3)
不禁止
你只需要
03 Field-x4 X(4).
03 Field-94 9(4).
Move Field-X4 to Field-94
答案 1 :(得分:3)
COBOL提供了几种完成此类任务的方法。从...开始 你问题中概述的声明:
01 A PIC X(6) VALUE "200030".
01 B PIC 9(6).
沿着以下行宣布另一个数据项:
01 AAAABB.
05 AAAA PIC 9(4).
05 BB PIC 9(2).
AAAABB
声明包含两个基本的记录结构(复合数据项)
数据项:AAAA
和BB
,两者都是数字。现在你可以做任何一个
以下内容:
MOVE A(1:4) TO B ; DISPLAY B
MOVE A TO AAAABB ; DISPLAY AAAA
DISPLAY BB
显示的输出为:
002000
2000
30
由于AAAABB
是复合项,因此它具有PIC X
隐式数据类型。这反过来
允许您分配几乎任何数据值,然后通过引用进行分解
它的各个组成部分。
请注意,如下的作业:
MOVE A TO AAAA; DISPLAY AAAA
这通常会编译(带有关于截断的警告)并产生以下内容 结果:
0030
最重要的数字已被截断(可能不是你想要的)。
COBOL在数据操作方面相当灵活。一 你应该注意的事情(防范)是非数字的暗示 数值数据项的值,如:
MOVE "20++30" TO A
MOVE A TO AAAABB
这将“正常”,直到您尝试执行以下操作:
ADD +1 TO AAAA
如果你很幸运,它会在这一点上爆炸(取决于你的编译器和 实际的非数字)。为了防止这种类型的错误你应该始终 包括以下逻辑:
MOVE A TO AAAABB
IF (AAAA NOT NUMERIC) OR (BB NOT NUMERIC)
PERFORM BAD-DATA-ASSIGNMENT
END-IF
ADD 1 TO AAAA
答案 2 :(得分:1)
您可以使用redefines
在COBOL中执行联合。这是来自记忆,但我认为它应该有效:
01 YEARMONTH.
03 YM-FULL PIC 9(6).
03 FILLER REDEFINES YM-FULL.
05 YM-YEAR PIC 9(4).
05 YM-MONTH PIC 9(2).
01 JUST-YEAR PIC 9(4).
MOVE 200030 TO YM-FULL.
MOVE YM-YEAR TO JUST-YEAR.