我无法让我的批处理正确解释我正在阅读的文件中的值。
这些值有一个单独的前导符号和一个实数,例如:
;+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
我以为我可以像上面那样定义一个数字,然后无需任何额外工作即可读取文件,但似乎无法使其正常工作。
如果我使用隐含小数,则不会出现错误。
是否可以混合使用单独的符号和实数十进制?
这一点相当重要。
首先,我将展示我如何做到这一点。我这样做是因为我想知道应该具有特定价值的所有事物确实具有该特定价值。
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 作为小数点生成的内容,因此只需更改您的数据定义以使用.而不是,.
如果您想使用这些数据,您可以将数字编辑的字段(即您拥有显式小数点的字段)移动到带有隐含小数位的字段。
只要数据处于固定位置,您的定义就会起作用。如果列内的“宽度”不同,则使用不同的解决方案会遇到不同的问题。
| 归档时间: |
|
| 查看次数: |
3505 次 |
| 最近记录: |