在 COBOL 中,如何将符号 comp-3 值与符号一起转换为可读格式
In COBOL, how to convert sign comp-3 value to a readable format along with sign
我遇到过这样一种情况,记录中的值采用以下格式
01 WS-PREMIUM PIC S9(05)V9(02) comp-3.
我们在 comp-3 中知道,符号存储在最后一个半字节中。
例如具有值 +1234.10 的 WS-PREMIUM 将存储为 x'0123410C' 或
具有值 -1234.10 的 WS-PREMIUM 将存储为 x'0123410D'。
现在我想将其写入报告文件((假设为 Daily Premium 文件)。该值应写入文件,其符号为 +1234.10$ 或 -1234.10$。
我在这个论坛上搜索答案,但我能找到的是报告部分中的预定义符号变量,而我正在寻找的是 运行 通过查看最后一个半字节并写入文件来识别符号的时间因此。我还听说他们在 java 中有一种方法可以做到这一点,但不确定如何做到这一点。
我知道,当我们使用 DISPLAY 时,它会显示带符号字节的解压缩十进制。
有人可以帮我解决这个问题吗?
提前致谢。
这是我使用的示例代码 -
IDENTIFICATION DIVISION.
PROGRAM-ID. V1329006.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT OPDATA ASSIGN TO "OPDATA.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD OPDATA.
01 WS-OP-RECORD PIC X(20).
WORKING-STORAGE SECTION.
01 HEADER-LINE.
05 FILLER PIC X(08) VALUE 'DATE'.
05 FILLER PIC X(01).
05 FILLER PIC X(08) VALUE 'PREMIUM'.
01 DETAIL-LINE.
05 WS-DATE PIC 9(08) VALUE '20181119'.
05 FILLER PIC X(01).
05 WS-PREMIUM PIC S9(05)V9(02) comp-3.
01 WS-INPUTS.
05 WS-EARNED-PREMIUM PIC S9(05)V9(02).
05 WS-RETURN-PREMIUM PIC S9(05)V9(02).
PROCEDURE DIVISION.
OPEN OUTPUT OPDATA.
MOVE '+1234.10' TO WS-EARNED-PREMIUM
MOVE '-10.05' TO WS-RETURN-PREMIUM
COMPUTE WS-PREMIUM =
WS-EARNED-PREMIUM + WS-RETURN-PREMIUM
DISPLAY 'WS-PREMIUM='WS-PREMIUM
WRITE WS-OP-RECORD FROM HEADER-LINE
WRITE WS-OP-RECORD FROM DETAIL-LINE
CLOSE OPDATA.
GOBACK.
END PROGRAM V1329006.
我希望输出显示为
DATE PREMIUM20181119 +1224.05
您可能需要检查 COBOL 中的 PICTURE 子句编辑。
一些有用的链接:PICTURE Clause Editing and Edited Pictures。
示例代码片段如下所示。
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC S9(05)V9(02) comp-3 VALUE -1234.10.
01 WS-GROUP.
05 WS-B PIC +99999.99.
05 WS-C PIC X VALUE '$'.
PROCEDURE DIVISION.
MOVE WS-A TO WS-B.
DISPLAY WS-GROUP.
STOP RUN.
输出:
-01234.10$
如果您希望带符号的压缩十进制数是人类可读的,则需要将其转换为另一种格式,即数字编辑格式。
我在 IBM 大型机 COBOL 上尝试了以下操作,并得到了这些结果。
01 DETAIL-LINE.
05 WS-DATE PIC 9(08) VALUE 20181119.
05 FILLER PIC X(01).
05 WS-PREMIUM PIC S9(05)V9(02) comp-3.
05 filler pic x value '$'.
DISPLAY DETAIL-LINE.
DATE PREMIUM
20181119 *$
这是带有隐式小数点的压缩十进制数,并在最后半个字节中签名。
01 DETAIL-LINE2.
05 WS-DATE2 PIC 9(08) VALUE 20181119.
05 FILLER PIC X(01).
05 WS-PREMIUM2 PIC S9(05)V9(02) SIGN LEADING SEPARATE.
05 filler pic x value '$'.
DISPLAY DETAIL-LINE2.
DATE PREMIUM
20181119 +0122405$
所以这里我们得到符号,它是可读的,但我们没有小数点,我们有一个前导零。
01 DETAIL-LINE3.
05 WS-DATE3 PIC 9(08) VALUE 20181119.
05 FILLER PIC X(01).
05 WS-PREMIUM3 PIC +9(05).9(02).
05 filler pic x value '$'.
DISPLAY DETAIL-LINE4.
DATE PREMIUM
20181119 +01224.05$
所以现在我们得到了小数点,但仍然有前导零。
01 DETAIL-LINE4.
05 WS-DATE4 PIC 9(08) VALUE 20181119.
05 FILLER PIC X(01).
05 WS-PREMIUM4 PIC +Z(05).9(02).
05 filler pic x value '$'.
DISPLAY DETAIL-LINE4.
DATE PREMIUM
20181119 + 1224.05$
所以现在我们没有前导零(但确实有前导 space)。
感谢@NicC 的下一部分。
01 DETAIL-LINE5.
05 WS-DATE5 PIC 9(08) VALUE 20181119.
05 FILLER PIC X(01).
05 WS-PREMIUM5 PIC +++++9.9(02).
05 filler pic x value '$'.
DISPLAY DETAIL-LINE5.
DATE PREMIUM
20181119 +1224.05$
所以有了额外的符号,符号就会变成浮动的,所以你不会再得到 spaces(或前导零)。
我遇到过这样一种情况,记录中的值采用以下格式 01 WS-PREMIUM PIC S9(05)V9(02) comp-3.
我们在 comp-3 中知道,符号存储在最后一个半字节中。 例如具有值 +1234.10 的 WS-PREMIUM 将存储为 x'0123410C' 或 具有值 -1234.10 的 WS-PREMIUM 将存储为 x'0123410D'。
现在我想将其写入报告文件((假设为 Daily Premium 文件)。该值应写入文件,其符号为 +1234.10$ 或 -1234.10$。 我在这个论坛上搜索答案,但我能找到的是报告部分中的预定义符号变量,而我正在寻找的是 运行 通过查看最后一个半字节并写入文件来识别符号的时间因此。我还听说他们在 java 中有一种方法可以做到这一点,但不确定如何做到这一点。
我知道,当我们使用 DISPLAY 时,它会显示带符号字节的解压缩十进制。
有人可以帮我解决这个问题吗? 提前致谢。
这是我使用的示例代码 -
IDENTIFICATION DIVISION.
PROGRAM-ID. V1329006.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT OPDATA ASSIGN TO "OPDATA.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD OPDATA.
01 WS-OP-RECORD PIC X(20).
WORKING-STORAGE SECTION.
01 HEADER-LINE.
05 FILLER PIC X(08) VALUE 'DATE'.
05 FILLER PIC X(01).
05 FILLER PIC X(08) VALUE 'PREMIUM'.
01 DETAIL-LINE.
05 WS-DATE PIC 9(08) VALUE '20181119'.
05 FILLER PIC X(01).
05 WS-PREMIUM PIC S9(05)V9(02) comp-3.
01 WS-INPUTS.
05 WS-EARNED-PREMIUM PIC S9(05)V9(02).
05 WS-RETURN-PREMIUM PIC S9(05)V9(02).
PROCEDURE DIVISION.
OPEN OUTPUT OPDATA.
MOVE '+1234.10' TO WS-EARNED-PREMIUM
MOVE '-10.05' TO WS-RETURN-PREMIUM
COMPUTE WS-PREMIUM =
WS-EARNED-PREMIUM + WS-RETURN-PREMIUM
DISPLAY 'WS-PREMIUM='WS-PREMIUM
WRITE WS-OP-RECORD FROM HEADER-LINE
WRITE WS-OP-RECORD FROM DETAIL-LINE
CLOSE OPDATA.
GOBACK.
END PROGRAM V1329006.
我希望输出显示为
DATE PREMIUM20181119 +1224.05
您可能需要检查 COBOL 中的 PICTURE 子句编辑。
一些有用的链接:PICTURE Clause Editing and Edited Pictures。
示例代码片段如下所示。
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC S9(05)V9(02) comp-3 VALUE -1234.10.
01 WS-GROUP.
05 WS-B PIC +99999.99.
05 WS-C PIC X VALUE '$'.
PROCEDURE DIVISION.
MOVE WS-A TO WS-B.
DISPLAY WS-GROUP.
STOP RUN.
输出:
-01234.10$
如果您希望带符号的压缩十进制数是人类可读的,则需要将其转换为另一种格式,即数字编辑格式。
我在 IBM 大型机 COBOL 上尝试了以下操作,并得到了这些结果。
01 DETAIL-LINE.
05 WS-DATE PIC 9(08) VALUE 20181119.
05 FILLER PIC X(01).
05 WS-PREMIUM PIC S9(05)V9(02) comp-3.
05 filler pic x value '$'.
DISPLAY DETAIL-LINE.
DATE PREMIUM
20181119 *$
这是带有隐式小数点的压缩十进制数,并在最后半个字节中签名。
01 DETAIL-LINE2.
05 WS-DATE2 PIC 9(08) VALUE 20181119.
05 FILLER PIC X(01).
05 WS-PREMIUM2 PIC S9(05)V9(02) SIGN LEADING SEPARATE.
05 filler pic x value '$'.
DISPLAY DETAIL-LINE2.
DATE PREMIUM
20181119 +0122405$
所以这里我们得到符号,它是可读的,但我们没有小数点,我们有一个前导零。
01 DETAIL-LINE3.
05 WS-DATE3 PIC 9(08) VALUE 20181119.
05 FILLER PIC X(01).
05 WS-PREMIUM3 PIC +9(05).9(02).
05 filler pic x value '$'.
DISPLAY DETAIL-LINE4.
DATE PREMIUM
20181119 +01224.05$
所以现在我们得到了小数点,但仍然有前导零。
01 DETAIL-LINE4.
05 WS-DATE4 PIC 9(08) VALUE 20181119.
05 FILLER PIC X(01).
05 WS-PREMIUM4 PIC +Z(05).9(02).
05 filler pic x value '$'.
DISPLAY DETAIL-LINE4.
DATE PREMIUM
20181119 + 1224.05$
所以现在我们没有前导零(但确实有前导 space)。
感谢@NicC 的下一部分。
01 DETAIL-LINE5.
05 WS-DATE5 PIC 9(08) VALUE 20181119.
05 FILLER PIC X(01).
05 WS-PREMIUM5 PIC +++++9.9(02).
05 filler pic x value '$'.
DISPLAY DETAIL-LINE5.
DATE PREMIUM
20181119 +1224.05$
所以有了额外的符号,符号就会变成浮动的,所以你不会再得到 spaces(或前导零)。