Cobol - 导入带实数的有符号数字

bek*_*bek 3 cobol

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

这些值有一个单独的前导符号和一个实数,例如:

;+000000123.99;+123456789.99;
Run Code Online (Sandbox Code Playgroud)

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

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).
Run Code Online (Sandbox Code Playgroud)

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

我以为我可以像上面那样定义一个数字,然后无需任何额外工作即可读取文件,但似乎无法使其正常工作。

如果我使用隐含小数,则不会出现错误。

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

Bil*_*ger 6

这一点相当重要。

首先,我将展示我如何做到这一点。我这样做是因为我想知道应该具有特定价值的所有事物确实具有该特定价值。

       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.
Run Code Online (Sandbox Code Playgroud)

然后在 中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
       .
Run Code Online (Sandbox Code Playgroud)

好的,为什么在你接受答案后我现在要展示?

您正在尝试使用 aSEPARATE SIGN和 没有验证数据的解决方案。在不验证数据的情况下,最简单的方法是“取消编辑”已编辑的数字。编译器为您完成所有工作,您只需编写一个 MOVE。如果符号“错误”,您将收到运行时错误。如果小数点值“错误”,则什么都不会发生。如果你的数字元素不是数字,你会得到一些稍微乱码的版本。要做到这一点,您必须 100% 信任这些数字。我总是验证来自外部文件和报告的数据。

好的,你是 DECIMAL POINT IS...

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

除非您使用DECIMAL POINT IS COMMACOBOL 使用句号/句点/点作为小数点。

您的数据包含 COBOL 作为小数点生成的内容,因此只需更改您的数据定义以使用.而不是,.

如果您想使用这些数据,您可以将数字编辑的字段(即您拥有显式小数点的字段)移动到带有隐含小数位的字段。

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