如何为十进制值转换为字符串在COBOL
问题描述:
考虑下面的代码:如何为十进制值转换为字符串在COBOL
VAR X PIC S9(7)V9(2).
VAR Y PIC X(15)
下面的代码有编译错误。
MOVE X TO Y. * compile error.
该错误消息是这样的“不能移动非整数编号,字母数字变量”
有任何方法来解决这个问题而不使另一变量的使用(例如显示瓦尔)?
答
此修复程序有时涉及REDEFINES为:
01.
05 Y PIC X(15).
05 X REDEFINES Y PIC S9(7)V9(2).
注意X
占据更少的存储空间比Y
所以X
可以REDEFINE Y
而不是倒过来。由于两个X
和Y
现在占用相同的物理存储中,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
包含可读性和对正常人眼有意义的内容。
答
根据你想要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
试试吧,看看你想要什么答案。
警告,这只是徒手画,我还没有试过编译它。
答
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 <