2011-12-01 53 views
2

考慮下面的代碼:如何爲十進制值轉換爲字符串在COBOL

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

下面的代碼有編譯錯誤。

MOVE X TO Y. * compile error. 

該錯誤消息是這樣的「不能移動非整數編號,字母數字變量」

有任何方法來解決這個問題而不使另一變量的使用(例如顯示瓦爾)?

回答

8

此修復程序有時涉及REDEFINES爲:

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

注意X佔據更少的存儲空間比Y所以X可以REDEFINE Y而不是倒過來。由於兩個XY現在佔用相同的物理存儲中,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  < 

正如你可以很快地看到,其結果是可能不是你所希望的,因爲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包含可讀性和對正常人眼有意義的內容。

1

根據你想要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 

試試吧,看看你想要什麼答案。

警告,這只是徒手畫,我還沒有試過編譯它。

0
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個字節,就沒有必要將移動到T或U.

輸出是事先考慮到的任何值的在Y:

X: >12345678R<Y:> -1234567.89< 
X: >12345678R<Y:>-1234567.89 < 
相關問題