2011-12-01 71 views
2

考虑下面的代码:如何为十进制值转换为字符串在COBOL

VAR X PIC S9(7)V9(2). 
VAR Y PIC X(15) 

下面的代码有编译错误。

MOVE X TO Y. * compile error. 

该错误消息是这样的“不能移动非整数编号,字母数字变量”

有任何方法来解决这个问题而不使另一变量的使用(例如显示瓦尔)?

回答

8

此修复程序有时涉及REDEFINES为:

01. 
    05 Y PIC X(15). 
    05 X REDEFINES Y PIC S9(7)V9(2). 

注意X占据更少的存储空间比Y所以X可以REDEFINE Y而不是倒过来。由于两个XY现在占用相同的物理存储中,MOVE可以删除以下程序的输出说明:

IDENTIFICATION DIVISION. 
    PROGRAM-ID. EXAMPLE. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION.    
    01 Y PIC X(15). 
    01 X REDEFINES Y PIC S9(7)V9(2). 
    PROCEDURE DIVISION. 
     MOVE -1234567.89 TO X 
     DISPLAY 'X: >' X '<Y:>' Y '<' 
     . 

输出:

X: >12345678R<Y:>12345678R  < 

正如你可以很快地看到,其结果是可能不是你所希望的,因为Y不包含人类可读的格式化数字(即带有前导符号和小数点的数字)。

所以我给你的建议是不要试图弯曲COBOL到它不是。按照它打算使用的语言使用。你可能需要做的是沿着线的东西:

IDENTIFICATION DIVISION.    
    PROGRAM-ID. EXAMPLE.     
    DATA DIVISION.      
    WORKING-STORAGE SECTION.    
    01 Y PIC X(15).      
    01 X PIC S9(7)V9(2).     
    01 T PIC -9(7).99.     
    PROCEDURE DIVISION.     
     MOVE -1234567.89 TO X    
     MOVE X TO T      
     MOVE T TO Y      
     DISPLAY 'X: >' X '<Y:>' Y '<' 
     GOBACK       
     .         

,输出:

X: >12345678R<Y:>-1234567.89 < 

是,上述程序使用一个额外的变量,中间要转换数字格式显示格式,但这正是语言设计的方式。啰嗦,但很直接。在练习结束时,变量Y包含可读性和对正常人眼有意义的内容。

1

根据你想要Y包含什么,没有。

01 VARS. 
    05 X PIC S9(7)V9(2). 
    05 Y REDEFINES X PIC X(9). 
    05 Z PIC -9(7).99. 
    05 Q PIC X(11). 

    MOVE X TO Z 
    MOVE Z TO Q 
    DISPLAY Y 
    DISPLAY Q 

试试吧,看看你想要什么答案。

警告,这只是徒手画,我还没有试过编译它。

0
IDENTIFICATION DIVISION. 
PROGRAM-ID. EXAMPLE. 
DATA DIVISION. 
WORKING-STORAGE SECTION. 
01 Y PIC X(15). 
01 T REDEFINES Y PIC -(5)9(7).99. 
01 U REDEFINES Y PIC -9(7).99B(4). 
01 X PIC S9(7)V9(2). 
PROCEDURE DIVISION. 
    MOVE -1234567.89 TO X 
    MOVE X TO T 
    DISPLAY 'X: >' X '<Y:>' Y '<' 
    MOVE X TO U 
    DISPLAY 'X: >' X '<Y:>' Y '<' 
    GOBACK 
    . 

T给出右对齐,U给出左对齐。由于两个REDEFINES占据整个15个字节,就没有必要将移动到T或U.

输出是事先考虑到的任何值的在Y:

X: >12345678R<Y:> -1234567.89< 
X: >12345678R<Y:>-1234567.89 < 
相关问题