如何在COBOL中对PICX子句进行REDEFINE和执行算术运算

我需要将具有 2 位小数的数字的 PIC X 定义字段移动到数字字段以执行涉及 comp-3 字段的算术函数。

我需要将具有 2 位小数的数字的 PIC X 定义字段移动到数字字段以执行涉及 comp-3 字段的算术函数。

我做了从 PIC X 到 PIC 9 的重新定义,如下所示:EX.PIC X(10)到 PIC 9(7).99。

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

Compute FIELD-RESULT defined as S9 (9) v99 = FIELD-1 (defined as S9 (9) V99)-FIELD-2 (my redefined field PIC 9 (7).99.

Thanks!!

4

你可以看看内在函数 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

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

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

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

1

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

给定一个包含“数字”的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 中没有普遍简单或愚蠢的方法。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(897)
Hibernate抛出org.hibernate.AnnotationException:没有为实体指定标识符:com..dom
上一篇
你可以使用生成器函数做什么 (generator function python)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(43条)