在 COBOL 的世界中,您要做的是“删除”数字数据类型。
给定一个PIC X(10)
包含“数字”的字段,将其转换为数字数据类型。如果始终保证此“数字”具有相同的格式:7 位数字、一个小数点和小数点后 2 位数字,那么在 COBOL 中执行此操作的经典方法是:
01.
02 NUM-AS-PIC PIC X(10).
03 NUM-EDITED REDEFINES NUM-AS-PIC PIC 9(7).99.
01 NUM-DEEDITED PIC 9(7)V99.
MOVE '1234567.89' TO NUM-AS-PIC <- alpha-numeric move
MOVE NUM-EDITED TO NUM-DEEDITED <- deediting numeric move
ADD 1 TO NUM-DEEDITED <- numeric computation
MOVE NUM-DEEDITED TO NUM-EDITED <- recover explicit decimal (editing)
DISPLAY NUM-AS-PIC <- alpha-numeric display
主要缺点是它不是很灵活。您将始终需要确保NUM-AS-PIC
包含完全正确的格式。例如
MOVE '123.45' TO NUM-AS-PIC
将导致运行时错误,因为小数点位置错误(MOVE
从左侧填充而不是从右侧填充)并且尾随空格在构成剩余 4 个字节后填充(并且空格不是有效的数值)。
另一种常见的方法是使用NUMVAL
函数。此函数采用任何有效的编辑数字格式并将其转换为浮点数字表示。数值可能附加了前导或尾随空格。的结果NUMVAL
可以分配给任何有效的数字数据类型。例如:
MOVE '1234567.89' TO NUM-AS-PIC <- alpha-numeric move
COMPUTE NUM-DEEDITED = FUNCTION NUMVAL(NUM-AS-PIC)
现在
MOVE '123.45' TO NUM-AS-PIC
COMPUTE NUM-DEEDITED = FUNCTION NUMVAL(NUM-AS-PIC)
也会导致有效的移动。NUM-AS-PIC
但是,如果其中包含的值无法转换为有效的浮点数,仍会发生运行时错误。例如:
MOVE '12A.23' TO NUM-AS-PIC
COMPUTE NUM-DEEDITED = FUNCTION NUMVAL(NUM-AS-PIC)
仍然会导致运行时错误。
可悲的是,在 COBOL 中没有普遍简单或万无一失的方法来执行此操作。