【问题标题】:In COBOL, how to convert sign comp-3 value to a readable format along with sign在 COBOL 中,如何将符号 comp-3 值与符号一起转换为可读格式
【发布时间】:2019-04-21 11:05:57
【问题描述】:

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

我希望输出显示为

日期 PREMIUM20181119 +1224.05

【问题讨论】:

  • 请包括您尝试过的源代码、给出的结果以及您的预期结果应该是什么样子。还包括足够的数据值。从上面我无法判断什么是有效的,什么是无效的。
  • 我添加了我使用的示例代码,结果应该看起来像 - DATE PREMIUM 20181119 +1224.05
  • 仅供参考,我刚刚修复了示例代码 sn-p 的链接。
  • 嗨@VinDesai,在上面显示的代码 sn-p 中,看起来01 DETAIL-LINE 组项正在用于WRITE 到输出文件。为什么不直接删除 COMP-3 并用数字编辑的 PICTURE 子句替换它,例如 +99999.99?

标签: file cobol comp-3


【解决方案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$

因此,使用额外的符号,符号会变为浮动,因此您不会再出现空格(或前导零)。

【讨论】:

  • 如果您希望标志紧靠然后编号,则将其指定为浮动标志,例如+,+++9.99 如果值为 -.99,则为 -0.99,如果值为 1.25,则为 +1.25。
【解决方案2】:

您可能需要检查 COBOL 中的 PICTURE 子句编辑。

一些有用的链接:PICTURE Clause Editing 和 Edited Pictures。

示例代码 sn-p 如下所示。

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$

【讨论】:

  • 感谢您的帮助。我正在寻找的是在文件中写入 comp-3。 DISPLAY 子句无论如何都会解包并显示它。我更关心将其写入文件。我也不能在程序中定义符号 + 或 - 因为它取决于计算值。我们最终可能会得到应该打印在文件中的否定结果。
  • 嗨@VinDesai 我相信您可以将PICTURE 子句编辑字段写入输出文件。对于符号,您可能更喜欢在已编辑字段的 PIC 子句中使用 + 符号。如果值为正,则打印 +,如果值为负,则打印 -。在我展示的示例中,数字编辑字段 (WS-B) 的 PIC 子句具有 +ve 符号,而输入值为 -ve。输出显示 -ve。如果您需要更多详细信息,请告诉我。
  • @piet.t 根据您的建议,我在答案中添加了示例代码而不是链接。谢谢!
  • 谢谢@SrinivasanJv。我使用带有符号链的数字编辑,这给了我想要的结果。非常感谢您的帮助。
  • 我很高兴它有帮助。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多