如何在COBOL中重新定义PIC X子句并对其执行运算



我需要将PIC X定义的具有2位小数的数字的字段移动到数字字段,以执行涉及comp-3字段的算术函数。最好的方法是什么?

我做了一个重新定义从PIC X到PIC 9与以下:例:PIC X(10)至PIC 9(7).99.

但是现在我如何用这个重新定义的字段执行计算呢?我要重新定义重新定义的字段吗?

Compute field - result定义为S9(9)v99 = field -1(定义为S9(9)v99) - field -2(我的重定义字段PIC 9(7).99.

谢谢! !

您可以查看内部函数NUMVAL。

你需要有"好的"数据,因为NUMVAL,无论如何,在大型机上,如果给定无效的数据(文本不是一个有效的"编辑"数字),就会失败。

COMPUTE X-TO-NUMERIC = FUNCTION NUMVAL ( text-data )

你可以这样定义:

01  TEXT-NUMBER PIC X(10).
01  EDITED-NUMBER REDEFINES TEXT-NUMBER PIC 9(7).99  (or Z(6)9.99 or Z(7)9.99 or whatever)
01  X-TO-NUMERIC PIC 9(7)V99.
MOVE EDITED-NUMBER TO X-TO-NUMERIC

仍然可以失败,或者只是错误,无效的数据。

或者,我喜欢的方法:

01  CONVERTED-NUMBER PIC 9(7)V99.
01  FILLER REDEFINES CONVERTED-NUMBER.
    05  CN-INTEGER-PART PIC X(7).
    05  CN-DECIMAL-PART PIC XX.

01  TEXT-NUMBER PIC X(10).
01  FILLER REDEFINES TEXT-NUMBER.
    05  TN-INTEGER-PART  PIC X(7).
    05  TN-DECIMAL-POINT PIC X.
        88  TN-DECIMAL-POINT VALID VALUE ".".
    05  TN-DECIMAL-PART  PIC XX.
IF ( TN-INTEGER-PART NUMERIC )
AND ( TN-DECIMAL-PART NUMERIC )
AND ( TN-DECIMAL-POINT )
    MOVE TN-INTEGER-PART TO CN-INTEGER-PART
    MOVE TN-DECIMAL-PART TO CN-DECIMAL-PART
ELSE
    deal with invalid
END-IF

不会失败,不会得到错误的结果。

编辑:为什么我不建议修改参考文献?对于人来说,如果只使用字面量,如果使用数据名,那么"阅读"就不那么容易了,仍然不如数据定义方法清晰和慢,所以我对它们进行了更改。

编辑。这里又被另一个问题吸引,我注意到:在这个例子中。不需要将n - integer - part、n - decimal - part、n - integer - part或n - decimal - part定义为数字字段。

在COBOL的世界中,您要做的是"删除"a数值数据类型。

给定一个包含"number"的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中的value不能转换为有效的浮点数。例如:

  MOVE '12A.23' TO NUM-AS-PIC
  COMPUTE NUM-DEEDITED = FUNCTION NUMVAL(NUM-AS-PIC)

仍然会导致运行时错误。

令人遗憾的是,没有普遍的简单或万无一失的方法

相关内容

  • 没有找到相关文章

最新更新