如何将文本中的数字移动到数字?

时间:2011-03-14 02:50:41

标签: cobol

我想问一下,如何将文本中的数字移动,例如:01 A PIC X(6)值“200030”,以及01 B PIC 9(6)等数字,我只想提取第一个A的数量为A.在Cobol中禁止使用MOVE进行此类移动,我使用的移动是将A(1:4)移动到B。

3 个答案:

答案 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声明包含两个基本的记录结构(复合数据项) 数据项:AAAABB,两者都是数字。现在你可以做任何一个 以下内容:

  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.