我无法让我的批处理正确解释我正在阅读的文件中的值。
值具有单独的前导符号和实数小数,例如:
;+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
我以为我能够像上面那样定义一个数字,只是在没有任何额外工作的情况下阅读文件,但似乎无法让它发挥作用。
如果我使用隐含的小数,我就不会收到错误。
是否可以混合使用单独和实数十进制的符号?
答案 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会产生的小数点,因此只需将数据定义更改为使用.
而不是,
。
如果要使用数据,可以将带有隐含小数位的字段移动数字编辑字段(具有明确的小数点)。
只要数据处于固定位置,您的定义就会起作用。如果"宽度"如果在列中有所不同,则使用不同的解决方案会遇到不同的问题。