Encoding 在COBOL中显示零

Encoding 在COBOL中显示零,encoding,cobol,gnucobol,Encoding,Cobol,Gnucobol,我是COBOL新手,我们最新的培训活动是,我们将尝试获得以下三个项目的输出: WORKING-STORAGE SECTION. 01 NUM3 PIC X(7). 01 NUM3-NUMBERS PIC 9(5) VALUE 12345. PROCEDURE DIVISION. STRING NUM3-NUMBERS "**" DELIMITED BY SIZE INTO NUM3. DISPLAY "3) "NUM3. 0000/2013 00012345 12345** 我已经尝试了

我是COBOL新手,我们最新的培训活动是,我们将尝试获得以下三个项目的输出:

WORKING-STORAGE SECTION.

01 NUM3 PIC X(7).
01 NUM3-NUMBERS PIC 9(5) VALUE 12345.

PROCEDURE DIVISION.

STRING NUM3-NUMBERS "**" DELIMITED BY SIZE INTO NUM3.
DISPLAY "3) "NUM3.
  • 0000/2013
  • 00012345
  • 12345**
  • 我已经尝试了下面的代码,但它显然没有给我想要的输出。它不显示零

    IDENTIFICATION DIVISION.
    
    PROGRAM-ID. ACTIVITY4.
    
    ENVIRONMENT DIVISION.
    
    DATA DIVISION.
    
    WORKING-STORAGE SECTION.
    
    01 NUM1 PIC z(4)9(4) VALUE 2013.
    01 NUM2 PIC Z(3)9(5) VALUE 12345.
    01 NUM3 PIC 9(5) VALUE 12345.
    01 E-NUM1 PIC *(2)9 VALUE 0.
    
    PROCEDURE DIVISION.
    
    DISPLAY-VALUES.
    
    DISPLAY-ZEROES.
    
    MOVE E-NUM1 TO NUM3.
    
     DISPLAY "1) "NUM1.
    
     DISPLAY "2) "NUM2.
    
     DISPLAY "3) "NUM3.
    
     STOP RUN.
    

    声明数字时请删除Z

    Z抑制COBOL中数字的前导零

    只需将变量声明更改为:

    01 NUM1 PIC 9(8) VALUE 00002013.
    01 NUM2 PIC 9(8) VALUE 00012345.
    
    (实际上,数字中不需要前面的零,它们只是用来显示整个图片的。)

    请参阅,以获取有关图片语句的更详细描述,以及不同字符修饰符及其作用的快速摘要

    一开始我没有注意到另一个问题,但是您创建的另一个变量应该是

    01 E-NUM1 PIC 9(2) VALUE 0.
    

    在我看来,活动4是关于格式化输出数据的。您需要制作:

    0000/2013
    00012345
    12345**
    
    第一个要求插入斜杠。COBOL有一个斜杠插入符号“/”。第二个是确保零抑制,这是PIC 9(n)字段输出时的行为,因此除了获得正确的长度外,没有什么真正要做的。第三个明显地将您吸引到“*”替换编辑字段,我猜这就是问题的意图,但是*编辑符号仅替换前导零

    获取尾随星号的一种简单方法是使用数据定义。定义要显示的组项目。从属于这一点,定义你的数字(图9(5)),然后立即使用一个填充符(如果你喜欢,命名字段)PIC XX,它的值是
    “**”
    (或所有
    “*”
    ,但对于两字节字段来说有点极端)

    程序司

    DISPLAY-VALUES.
    
    DISPLAY-ZEROES.
     MOVE 1234 TO NUM1
    
     DISPLAY "1) " 
                 ">"
                 NUM1
                 "<"
     MOVE 12345 TO NUM2
    
     DISPLAY "2) "
                 ">"
                 NUM2
                 "<"
     MOVE 12345 TO NUM3
     DISPLAY "3) "
                 ">"
                 NUM3-OUT
                 "<"
    
     STOP RUN
     .
    
    DISPLAY-value。
    显示零。
    移动1234到NUM1
    显示“1”)
    ">"
    NUM1
    ""
    NUM2
    ""
    NUM3-OUT
    
    “关于
    12345**
    问题:如果没有其他办法,您可以使用
    字符串将数字连接到星号,如下所示:

    WORKING-STORAGE SECTION.
    
    01 NUM3 PIC X(7).
    01 NUM3-NUMBERS PIC 9(5) VALUE 12345.
    
    PROCEDURE DIVISION.
    
    STRING NUM3-NUMBERS "**" DELIMITED BY SIZE INTO NUM3.
    DISPLAY "3) "NUM3.
    
    此代码的作用是在数字的末尾添加两个星号。 (但您的NUM3现在是字母数字图片,而不是数字图片)

    我刚刚在一本旧cobol书中发现的另一个东西是
    *
    检查保护字符。我从未尝试过它,但在这里它指出应该这样使用:

    01 NUM3 PIC 9(5)*(2).
    

    试试看!

    它仍然不起作用,我已经尝试了每个编译选项,仍然一样。我对代码所做的唯一其他更改是对第三个变量声明(其中声明*(2)9)。我将更新我的答案以反映这一点。你应该使用-x和-free(-free是可选的,但很好)编译时的参数。此外,您说您希望#3的输出为12345,但您将0移动到持有12345的变量中,这只是为了玩弄一些东西吗?为了完整性,您应该编辑您的问题,以包括您的代码实际获得的输出。这本书可能会说,检查保护仅适用于前导零。Mine有。我怀疑任何COBOL编译器都不会抑制尾随零,即使该值有尾随零,但事实并非如此。您觉得使用字符串比将其一直放在工作存储器中有什么好处?