gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:38:14 25 4
gpt4 key购买 nike

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

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

;+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

我以为我可以像上面那样定义一个数字并读取文件而不需要任何额外的工作,但似乎无法让它工作。

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

难道不能混合使用符号前导的独立小数和实数小数吗?

最佳答案

这一点非常重要。

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

       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 将生成的小数点,因此只需将您的数据定义更改为使用 . 而不是 ,

如果你想使用数据,你可以将数字编辑字段(即你有一个明确的小数点)移动到一个隐含小数位的字段。

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

关于Cobol - 导入带实数的带符号数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22387511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com