2011-03-14 62 views
0

我想問一下,如何在文本中移動數字,例如:01 PIC X(6)值「200030」,如01 B PIC 9(6),我只想提取前4個A.在COBOL這種類型的使用MOVE舉動是被禁止的號碼,我用的是移動移動(1:4)B.如何將文本中的數字移至數字?

+0

不,不禁止...... – 2011-03-14 03:01:47

+0

我已經更新的情況下,這種情況下是被禁止的?我有一個錯誤。 – lamwaiman1988 2011-03-14 03:05:45

回答

2

它不禁止

你只需要

03 Field-x4    X(4). 
03 Field-94    9(4). 




    Move Field-X4   to Field-94 
+0

謝謝......我的舉動是不被禁止的.....我剛剛在我的程序的其他地方發生了一個錯誤... – lamwaiman1988 2011-03-14 03:33:49

1

您可以使用redefines在COBOL中進行工會。這是來自內存,但我認爲它應該工作:

01 YEARMONTH. 
    03 YM-FULL      PIC 9(6). 
    03 FILLER REDEFINES YM-FULL. 
     05 YM-YEAR     PIC 9(4). 
     05 YM-MONTH    PIC 9(2). 

01 JUST-YEAR      PIC 9(4). 

MOVE 200030 TO YM-FULL. 
MOVE YM-YEAR TO JUST-YEAR. 
+0

我曾經看過一些程序這樣做...可怕...謝謝。 – lamwaiman1988 2011-03-14 04:20:35

+0

@ gunbuster,總是樂於爲人們的問題提供可怕的解決方案:-) – paxdiablo 2011-03-14 05:00:15

+0

似乎對我很好。不知道什麼被認爲是「可怕的」? – 2013-01-28 20:09:23

2

COBOL提供了幾種方法來完成這種分配。與 開始在你的問題中列出的聲明:

01 A PIC X(6) VALUE "200030". 
    01 B PIC 9(6). 

沿線的聲明另一個數據項:

01 AAAABB. 
    05 AAAA PIC 9(4). 
    05 BB  PIC 9(2). 

AAAABB聲明包含兩個基本 數據項的記錄結構(複合數據項) :AAAABB,它們都是數字。現在你可以做任何的 的以下內容:

MOVE A(1:4) TO B ; DISPLAY B 
    MOVE A TO AAAABB ; DISPLAY AAAA 
         DISPLAY BB 

顯示的輸出將是:

002000 
2000 
30 

由於AAAABB是它有一個PIC X隱式數據類型複合項目。這反過來, 允許您分配幾乎任何數據值,然後通過參考 分解它的各個組件。

當心,分配如:

MOVE A TO AAAA; DISPLAY AAAA 

這將通常編譯(用約截斷警告),併產生以下 結果:

0030  

最顯著位數已被截斷(可能不是你想要的)。

COBOL在數據操作方面相當靈活。一分 的事情,你應該看出來(防範)非數值 值數值數據項目的處理分配爲:

MOVE "20++30" TO A 
MOVE A TO AAAABB 

這將「工作」就好了,直到你嘗試做一些事情,如:

ADD +1 TO AAAA 

如果你幸運的話它會在這一點炸掉(取決於你的編譯器和 實際非數字)。爲了防止這種類型的錯誤,你應該總是 包括沿線的邏輯:

MOVE A TO AAAABB 
IF (AAAA NOT NUMERIC) OR (BB NOT NUMERIC) 
    PERFORM BAD-DATA-ASSIGNMENT 
END-IF 
ADD 1 TO AAAA 
+0

至於AAAABB的例子,你說它隱含地是一個文本,那麼我們可以在AAAA和BB上做數學事情嗎? – lamwaiman1988 2011-03-15 03:08:38

+0

正確,組合項目是無類型的(隱式文本),但較低級別的元素顯式爲PIC 9(數字)。請注意,這隻適用於因爲這些數字項不被聲明爲壓縮十進制(例如PIC S9(4)PACKED-DECIMAL)或二進制(例如PIC S9(4)BINARY)。與大多數編程語言一樣,COBOL支持多種數字數據類型。 – NealB 2011-03-15 11:42:11

相關問題