在COBOL中,如何将符号comp-3值与符号

时间:2018-11-19 05:15:50

标签: file cobol comp-3

我遇到了一种情况,记录中的值格式如下 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

2 个答案:

答案 0 :(得分:3)

您可能必须在COBOL中检查 PICTURE子句编辑

一些有用的链接:PICTURE Clause EditingEdited 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$

因此,有了多余的符号,符号就会变成浮动的,因此您不再有空格(或前导零)。