如何在COBOL中重新定义和执行PIC X子句的算术运算

时间:2013-01-17 03:04:52

标签: cobol

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

我确实从PIC X重新定义了PIC 9,具体如下: EX。 PIC X(10)至PIC 9(7).99。

但是现在如何使用重新定义的字段执行计算?我是否重新定义了重新定义的字段?

计算FIELD-RESULT,定义为S9(9)v99 = FIELD-1(定义为S9(9)V99) - FIELD-2(我重新定义的字段PIC 9(7).99。

谢谢!

2 个答案:

答案 0 :(得分:4)

您可以查看内在的FUNCTION 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

不会失败,不会得到不正确的结果。

编辑:为什么我没有建议参考修改?如果仅使用文字,如果使用数据名,仍然不如数据定义方法那么清晰和慢,那么对于人来说“阅读”则不那么容易,所以我改变了它们。

EDIT。我又注意到另一个问题,我注意到:在这个例子中。不需要将CN-INTEGER-PART,CN-DECIMAL-PART,TN-INTEGER-PART或TN-DECIMAL-PART定义为数字字段。

答案 1 :(得分:1)

在COBOL的世界里,你要做的就是“deedit”a 数字数据类型。

如果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中。