如何在 COBOL 中将十进制值转换为字符串

发布于 2024-12-19 03:01:21 字数 233 浏览 3 评论 0原文

给出以下代码:

VAR X  PIC S9(7)V9(2).
VAR Y PIC X(15)

以下代码有编译错误。

MOVE  X TO Y.    * compile error.

错误消息类似于“无法将非整数数字移动到字母数字变量”

有没有办法在不使用其他变量(例如显示变量)的情况下解决此问题?

Given following code:

VAR X  PIC S9(7)V9(2).
VAR Y PIC X(15)

Following code having compile error.

MOVE  X TO Y.    * compile error.

the error message is something like this "cannot move non-integer numbers to alphanumeric variable"

is there any way to fix this issue without making use of another variables (e.g. display vars) ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

倾城泪 2024-12-26 03:01:21

修复有时涉及 REDEFINES,如下所示:

01.
    05 Y PIC X(15).
    05 X REDEFINES Y PIC S9(7)V9(2).

请注意,X 占用的存储空间少于 Y,因此 X 可以 REDEFINE Y,但反之则不然。 Y 现在占用相同的物理存储,因此可以删除 MOVE,如以下程序和输出所示:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. EXAMPLE.
   DATA DIVISION.
   WORKING-STORAGE SECTION.              
   01  Y PIC X(15).
   01  X REDEFINES Y  PIC S9(7)V9(2).
   PROCEDURE DIVISION.
       MOVE -1234567.89 TO X
       DISPLAY 'X: >' X '< Y: >' Y '<'
       .

输出:

X: >12345678R< Y: >12345678R      <

由于 X可以很快看到,结果可能不是您所希望的,因为 Y 不包含人类可读的格式化数字(即带有前导符号和小数点的数字)。

所以我给你的建议是,不要尝试将 COBOL 弯曲成它不是的东西。按照语言的预期用途使用该语言。您可能需要做的是以下内容:

   IDENTIFICATION DIVISION.             
   PROGRAM-ID. EXAMPLE.                 
   DATA DIVISION.                       
   WORKING-STORAGE SECTION.             
   01  Y PIC X(15).                     
   01  X PIC S9(7)V9(2).                
   01  T PIC -9(7).99.                  
   PROCEDURE DIVISION.                  
       MOVE -1234567.89 TO X            
       MOVE X TO T                      
       MOVE T TO Y                      
       DISPLAY 'X: >' X '< Y: >' Y '<'  
       GOBACK                           
       .                                

哪些输出:

X: >12345678R< Y: >-1234567.89    <

是的,上面的程序在中间使用了一个附加变量将数字格式转换为显示格式,但这正是该语言的设计方式。啰嗦但非常直接。在练习结束时,变量 Y 包含一些对正常人眼可读且有意义的内容。

The fix sometimes involves REDEFINES as in:

01.
    05 Y PIC X(15).
    05 X REDEFINES Y PIC S9(7)V9(2).

Notice that X occupies less storage than Y so X can REDEFINE Y but not the other way round. Since both X and Y now occupy the same physical storage, the MOVE can be dropped as the following program and output illustrate:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. EXAMPLE.
   DATA DIVISION.
   WORKING-STORAGE SECTION.              
   01  Y PIC X(15).
   01  X REDEFINES Y  PIC S9(7)V9(2).
   PROCEDURE DIVISION.
       MOVE -1234567.89 TO X
       DISPLAY 'X: >' X '< Y: >' Y '<'
       .

Output:

X: >12345678R< Y: >12345678R      <

As you can quickly see, the result is probably not what you were hoping for since Y does not contain a human readable formatted number (i.e. one with a leading sign and a decimal point).

So my advice to you is don't try bend COBOL into something that it is not. Use the language as it was intended to be used. What you probably need to do is something along the lines of:

   IDENTIFICATION DIVISION.             
   PROGRAM-ID. EXAMPLE.                 
   DATA DIVISION.                       
   WORKING-STORAGE SECTION.             
   01  Y PIC X(15).                     
   01  X PIC S9(7)V9(2).                
   01  T PIC -9(7).99.                  
   PROCEDURE DIVISION.                  
       MOVE -1234567.89 TO X            
       MOVE X TO T                      
       MOVE T TO Y                      
       DISPLAY 'X: >' X '< Y: >' Y '<'  
       GOBACK                           
       .                                

Which outputs:

X: >12345678R< Y: >-1234567.89    <

Yes, the above program uses an additional variable in the middle to convert numeric format to display format, but that is exactly how the language was designed. Long winded but very straight forward. At the end of the exercise variable Y contains something that is readable and makes sense to the normal human eye.

烂人 2024-12-26 03:01:21

取决于您希望 Y 包含什么,否。

01  VARS.
    05  X PIC S9(7)V9(2).
    05  Y REDEFINES X PIC X(9).
    05  Z PIC -9(7).99.
    05  Q PIC X(11).

    MOVE X TO Z
    MOVE Z TO Q
    DISPLAY Y
    DISPLAY Q

尝试一下,看看什么可以给您带来您想要的答案。

警告,这只是徒手的,我还没有尝试编译它。

Depending on what you want Y to contain, no.

01  VARS.
    05  X PIC S9(7)V9(2).
    05  Y REDEFINES X PIC X(9).
    05  Z PIC -9(7).99.
    05  Q PIC X(11).

    MOVE X TO Z
    MOVE Z TO Q
    DISPLAY Y
    DISPLAY Q

Try it and see what gives you the answer you want.

Caveat, this was just freehand, I haven't tried compiling it.

残月升风 2024-12-26 03:01:21
IDENTIFICATION DIVISION. 
PROGRAM-ID. EXAMPLE. 
DATA DIVISION. 
WORKING-STORAGE SECTION. 
01  Y PIC X(15). 
01  T REDEFINES Y PIC -(5)9(7).99.
01  U REDEFINES Y PIC -9(7).99B(4).
01  X PIC S9(7)V9(2). 
PROCEDURE DIVISION. 
    MOVE -1234567.89 TO X 
    MOVE X TO T 
    DISPLAY 'X: >' X '< Y: >' Y '<'
    MOVE X TO U 
    DISPLAY 'X: >' X '< Y: >' Y '<'
    GOBACK 
    . 

T 给出右对齐,U 给出左对齐。由于两个 REDEFINES 占用了完整的 15 个字节,因此在 MOVE 到 T 或 U 之前无需考虑 Y 中的任何值。

输出为:

X: >12345678R< Y: >    -1234567.89<
X: >12345678R< Y: >-1234567.89    <
IDENTIFICATION DIVISION. 
PROGRAM-ID. EXAMPLE. 
DATA DIVISION. 
WORKING-STORAGE SECTION. 
01  Y PIC X(15). 
01  T REDEFINES Y PIC -(5)9(7).99.
01  U REDEFINES Y PIC -9(7).99B(4).
01  X PIC S9(7)V9(2). 
PROCEDURE DIVISION. 
    MOVE -1234567.89 TO X 
    MOVE X TO T 
    DISPLAY 'X: >' X '< Y: >' Y '<'
    MOVE X TO U 
    DISPLAY 'X: >' X '< Y: >' Y '<'
    GOBACK 
    . 

T gives right-alignment, U gives left-alignment. As both REDEFINES occupy the full 15 bytes, there is no need to take account of any value in Y prior to the MOVEs to T or U.

Output is:

X: >12345678R< Y: >    -1234567.89<
X: >12345678R< Y: >-1234567.89    <
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文