考慮下面的代碼:如何爲十進制值轉換爲字符串在COBOL
VAR X PIC S9(7)V9(2).
VAR Y PIC X(15)
下面的代碼有編譯錯誤。
MOVE X TO Y. * compile error.
該錯誤消息是這樣的「不能移動非整數編號,字母數字變量」
有任何方法來解決這個問題而不使另一變量的使用(例如顯示瓦爾)?
考慮下面的代碼:如何爲十進制值轉換爲字符串在COBOL
VAR X PIC S9(7)V9(2).
VAR Y PIC X(15)
下面的代碼有編譯錯誤。
MOVE X TO Y. * compile error.
該錯誤消息是這樣的「不能移動非整數編號,字母數字變量」
有任何方法來解決這個問題而不使另一變量的使用(例如顯示瓦爾)?
此修復程序有時涉及REDEFINES爲:
01.
05 Y PIC X(15).
05 X REDEFINES Y PIC S9(7)V9(2).
注意X
佔據更少的存儲空間比Y
所以X
可以REDEFINE Y
而不是倒過來。由於兩個X
和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 <
正如你可以很快地看到,其結果是可能不是你所希望的,因爲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
包含可讀性和對正常人眼有意義的內容。
根據你想要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
試試吧,看看你想要什麼答案。
警告,這只是徒手畫,我還沒有試過編譯它。
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 <