如何在COBOL中重新定义和执行PICX子句的算法

如何在COBOL中重新定义和执行PICX子句的算法,cobol,Cobol,我需要将一个PICX定义的字段(具有2位小数的数字)移动到一个数字字段,以执行涉及comp-3字段的算术函数。最好的方法是什么 我做了一个从图X到图9的重新定义,如下所示: 例:图十(10)至图九(7) 但是现在我如何使用重新定义的字段执行计算呢?我是否重新定义了重新定义的字段 计算字段结果定义为S9(9)v99=字段1(定义为S9(9)v99)-字段2(我重新定义的字段PIC 9(7).99 谢谢!!您可以查看内在函数NUMVAL 您需要有“良好”的数据,因为大型机上的NUMVAL在给定无效数

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

我做了一个从图X到图9的重新定义,如下所示: 例:图十(10)至图九(7)

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

计算字段结果定义为S9(9)v99=字段1(定义为S9(9)v99)-字段2(我重新定义的字段PIC 9(7).99


谢谢!!

您可以查看内在函数NUMVAL

您需要有“良好”的数据,因为大型机上的NUMVAL在给定无效数据(文本不是有效的“编辑”数字)时会失败

您可以这样定义:

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
不会失败,不会得到错误的结果

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


编辑。通过另一个问题再次在这里绘制,我注意到:在这个示例中,不需要将CN-INTEGER-PART、CN-DECIMAL-PART、TN-INTEGER-PART或TN-DECIMAL-PART定义为数字字段。

在COBOL的世界中,您试图做的是“deedit”a 数字数据类型

给定一个包含“数字”的
picx(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
将导致运行时错误,因为小数点位置错误 (
MOVE
从左向右填充)和 尾随空格在组成剩余的4个字节后填充(空格不是有效的数值)

另一种常用方法是使用
NUMVAL
函数 有效的编辑数字格式,并将其转换为浮点数字表示形式。 数值可以附加前导空格或尾随空格。
NUMVAL
的结果可以指定给任何有效的数值数据类型。例如:

  MOVE '1234567.89' TO NUM-AS-PIC         <- alpha-numeric move
  COMPUTE NUM-DEEDITED = FUNCTION NUMVAL(NUM-AS-PIC)
  MOVE '12A.23' TO NUM-AS-PIC
  COMPUTE NUM-DEEDITED = FUNCTION NUMVAL(NUM-AS-PIC)
也会导致有效移动。但是,如果
NUM-AS-PIC
中包含的值无法转换为有效的浮点数。 例如:

  MOVE '1234567.89' TO NUM-AS-PIC         <- alpha-numeric move
  COMPUTE NUM-DEEDITED = FUNCTION NUMVAL(NUM-AS-PIC)
  MOVE '12A.23' TO NUM-AS-PIC
  COMPUTE NUM-DEEDITED = FUNCTION NUMVAL(NUM-AS-PIC)
仍将导致运行时错误

不幸的是,没有一种简单易行的方法
这在COBOL中是有用的。

我想你的数据的代表性示例会很有用。我不太确定最后一句话。如果前导/尾随空格可以处理(尾随空格需要“Goldilocks”定义,“刚好”或“右对齐”。可变位置的小数点也可以。我想“普遍容易”是最重要的,因为人们通常期望“某种魔力”能为您带来一切,而不需要任何真正的代码:-)
  MOVE '12A.23' TO NUM-AS-PIC
  COMPUTE NUM-DEEDITED = FUNCTION NUMVAL(NUM-AS-PIC)