Cobol - 使用实数十进制导入带符号的数字

时间:2014-03-13 18:19:40

标签: cobol

我无法让我的批处理正确解释我正在阅读的文件中的值。

值具有单独的前导符号和实数小数,例如:

;+000000123.99;+123456789.99;

但以下只是给我编译错误:

10 FILLER     PIC X(1).
10 VALUE1     PIC S9(9),9(2) SIGN LEADING SEPARATE.
10 FILLER     PIC X(1).
10 VALUE2     PIC S9(9),9(2) SIGN LEADING SEPARATE.
10 FILLER     PIC X(1).

在这家商店,他们使用DECIMAL POINT IS COMMA

我以为我能够像上面那样定义一个数字,只是在没有任何额外工作的情况下阅读文件,但似乎无法让它发挥作用。

如果我使用隐含的小数,我就不会收到错误。

是否可以混合使用单独和实数十进制的符号?

1 个答案:

答案 0 :(得分:4)

这一点非常重要。

首先,我将展示我是如何做到这一点的。我是这样做的,因为我想知道应该具有特定值的所有东西都具有该特定值。

       05  VALUE-TO-DE-EDIT. 
           10  VTDE-SIGN                   PIC X. 
               88  VTDE-SIGN-VALID         VALUE "-" "+". 
               88  VTDE-NEGATIVE           VALUE "-". 
           10  VTDE-INTEGER-PART           PIC X(9). 
           10  VTDE-DEC-POINT              PIC X. 
               88  VTDE-DEC-POINT-VALID    VALUE ".". 
           10  VTDE-DECIMAL-PART           PIC XX. 
   01  THE-NUMBER                          PIC S9(9)V99. 
   01  FILLER REDEFINES THE-NUMBER. 
       05  TN-INTEGER-PART                 PIC X(9). 
  * The S in the PICture is required, to get correct sign for a
  * positive edited value, unless you do it a different way.
  * 
       05  TN-DECIMAL-PART                 PIC S99.

然后在PROCEDURE DIVISION中,细节当然可以有所不同,这只是一个保持简短和最小的例子:

       IF ( VTDE-SIGN-VALID 
        AND VTDE-DEC-POINT-VALID 
        AND VTDE-INTEGER-PART NUMERIC 
        AND VTDE-DECIMAL-PART NUMERIC ) 
           PERFORM                  DE-EDIT-NUMBER 
           DISPLAY THE-NUMBER 
       ELSE 
           PERFORM                  BUSTED-NUMBER 
       END-IF 
       IF ( VTDE-SIGN-VALID 
        AND VTDE-DEC-POINT-VALID 
        AND VTDE-INTEGER-PART NUMERIC 
        AND VTDE-DECIMAL-PART NUMERIC ) 
           PERFORM                  DE-EDIT-NUMBER 
           DISPLAY THE-NUMBER 
       ELSE 
           PERFORM                  BUSTED-NUMBER 
       END-IF 
       ... 
   DE-EDIT-NUMBER. 
       MOVE VTDE-INTEGER-PART       TO TN-INTEGER-PART 
       MOVE VTDE-DECIMAL-PART       TO TN-DECIMAL-PART 
       IF VTDE-NEGATIVE 
           SUBTRACT THE-NUMBER      FROM ZERO 
             GIVING                 THE-NUMBER 
       END-IF 
       . 
   BUSTED-NUMBER. 
       do what you feel
       .

好的,为什么我在你接受答案之后就显示出来了?

您正在使用SEPARATE SIGN尝试解决方案而未验证数据。在不验证数据的情况下,最简单的方法是去编辑"去编辑"编辑的号码。编译器为您完成所有操作,您只需编写一个MOVE代码。如果符号错误",您将收到运行时错误。如果小数点值为"错误"什么都不会发生。如果您的数字元素不是数字,那么您将获得一些略微混乱的版本。要做到这一点,你必须100%信任这些数字。来自外部文件和我始终验证的报告中的数据。

好的,你是DECIMAL POINT IS...

将S(不是数字编辑字段的符号)更改为+并删除SIGN LEADING SEPARATE。你应该好好去。

除非你使用DECIMAL POINT IS COMMA COBOL使用一个小数点的句号/句点/点。

您的数据包含COBOL会产生的小数点,因此只需将数据定义更改为使用.而不是,

如果要使用数据,可以将带有隐含小数位的字段移动数字编辑字段(具有明确的小数点)。

只要数据处于固定位置,您的定义就会起作用。如果"宽度"如果在列中有所不同,则使用不同的解决方案会遇到不同的问题。