我遇到了一种情况,记录中的值格式如下 01 WS-PREMIUM PIC S9(05)V9(02)comp-3。
在comp-3中我们知道,符号存储在最后的半字节中。 例如值+1234.10的WS-PREMIUM将存储为x'0123410C'或 值为-1234.10的WS-PREMIUM将存储为x'0123410D'。
现在,我想将其写入报告文件((让我们说“每日高级文件”。)此值应以符号+ 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.
我希望结果显示为
日期溢价20181119 +1224.05
答案 0 :(得分:3)
您可能必须在COBOL中检查 PICTURE子句编辑。
一些有用的链接:PICTURE Clause Editing和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$
答案 1 :(得分:1)
如果您希望带符号的十进制十进制数易于阅读,则需要将其转换为另一种格式,即数字编辑格式。
我在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$
所以现在我们没有前导零(但是有前导空格)。
感谢@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$
因此,有了多余的符号,符号就会变成浮动的,因此您不再有空格(或前导零)。