如何根据我设置的picture子句从COBOL中剪切计算结果



我正在尝试显示计算结果,如add、sub、mul和div。

我的问题是我设置了计算结果,但它没有切割。假设我说数字1 x 199999x99999,它会产生10位数字,所以我必须在数据分割工作存储部分使用PIC 9(10)。但如果是11111x22222,它将产生9位数字,因此结果将是0246908402。应该有一个0,因为我设置了PIC 9(10),但它只产生了9个数字。。。如果我设置CCD_ 7,它将被切割成CCD_。

我想在不设置PIC长度的情况下显示结果,所以如果它产生9个数字,它将显示所有9个数字。如果它产生7个数字,则它将显示全部7个数字而不被剪切,并且没有0来填充所有空格。有可能吗?这是代码

******************************************************** 
DATA DIVISION.                                          
WORKING-STORAGE SECTION.                                
01 INBOUND-MESSAGE                  PIC X(14).          
01 OUTBOUND-MESSAGE                 PIC X(80).          
01 WS-VARIABLE.                                         
05 DETAIL1                       PIC X(14)           
VALUE 'HASIL TAMBAH: '.                           
05 DETAIL2                       PIC X(14)           
VALUE 'HASIL KURANG: '.                           
05 DETAIL3                       PIC X(14)           
VALUE 'HASIL KALI  : '.                           
05 DETAIL4                       PIC X(14)           
VALUE 'HASIL BAGI  : '.                           
05 WS-NUM1                       PIC 9(5).           
05 WS-NUM2                       PIC 9(5).           
05 WS-ADD                        PIC 9(6).           
05 WS-SUB                        PIC 9(6).           
05 WS-MUL                        PIC 9(6). -> lets say i set this become 6 so if 11111x22222 it will produced 9  digits and will be cutted into 6 digits          
05 WS-DIV                        PIC 9(6).           
01 WS-STRING.                                           
05 WS-CONCAT                        PIC X(80).       
05 WS-CONCAT2                       PIC X(80).       
05 WS-CONCAT3                       PIC X(80).       
05 WS-CONCAT4                       PIC X(80).       
******************************************************** 
PROCEDURE DIVISION.                                     
EXEC CICS RECEIVE                              
INTO (INBOUND-MESSAGE)                     
END-EXEC.                                      

MOVE INBOUND-MESSAGE(5:5) TO WS-NUM1.          
MOVE INBOUND-MESSAGE(10:5) TO WS-NUM2.         
ADD WS-NUM1   TO WS-NUM2 GIVING WS-ADD.        
SUBTRACT WS-NUM1   FROM WS-NUM2 GIVING WS-SUB. 
MULTIPLY WS-NUM1 BY WS-NUM2 GIVING WS-MUL.     
DIVIDE WS-NUM1 BY WS-NUM2 GIVING WS-DIV.       

STRING DETAIL1                                 
WS-ADD                                  
DELIMITED BY ':'                               
INTO WS-CONCAT.                                
STRING DETAIL2                                 
WS-SUB                                  
DELIMITED BY ':'                               
INTO WS-CONCAT2.                               
STRING DETAIL3                                 
WS-MUL                                  
DELIMITED BY ':'                               
INTO WS-CONCAT3.                               
STRING DETAIL4                                 
WS-DIV                                  
DELIMITED BY ':'                               
INTO WS-CONCAT4.                               
EXEC CICS SEND                                 
FROM (WS-STRING)                           
ERASE                                      
NOHANDLE                                   
END-EXEC.                                      
EXEC CICS RETURN  
END-EXEC.         

如有任何帮助,将不胜感激

您可以使用COBOL编辑的数字,即

03 ws-output-number       pic zzzzzzzzz9.
ADD WS-NUM1   TO WS-NUM2 GIVING WS-ADD
move WS-ADD             to ws-output-number

将抑制领先的零点,但这会更好。

正如Simon所指出的,您可以使用FUNCTION TRIM(ws-output-number)来移除引导空间

03 ws-output-number       pic --,---,---,--9.

因为它包含符号+,所以将逗号添加到提高的可读性

如果我正确理解你的问题,你想抑制结果中的前导零吗?因此,在您的例子中,如果输出的最大可能值是一个10位数,您可以将其定义为PIC 9(10(。如果特定计算的输出结果为0000123456,则需要显示123456。理想情况下,您可能希望实际显示为123456或£123456。这一切都可以使用零抑制和编辑技术来实现,这些技术在IBM Enterprise COBOL Reference手册的"零抑制和替换编辑"一节中进行了描述。通常使用重定义将输出字段更改为所需格式。因此,WS-MUL仍然是PIC9(10(,但由WS-MUL-X使用PICZ(9(9重新定义。

最新更新