2012-12-16 121 views
1

我一直在這個問題上停留了一段時間。幫助將不勝感激。Cobol子串;採取4個字符的字符串,並採取內部2個字符

我有一個4位數字從文件讀入,我需要採取內部2位數字。 我認爲以字符串的形式讀取數字將是一個好主意,然後在子字符串中取兩個中間數字並使用numval函數將其轉換回來。不幸的是,我無法弄清楚如何獲得裏面的兩個字符。

Ex。 我有號碼5465,我想得到46.

+0

這有幫助嗎? http://stackoverflow.com/questions/8208111/substring-for-a-string-literal-in-cobol – Almo

+0

我的COBOL是生鏽的,但除了上述另一種方式將是有一個記錄,其中包含兩個PIC 9 2)數據類型。 – PeterJ

回答

3

如果你把它作爲一個數字而不是一個字符串,你可以算術地做。鑑於I5465,並要存儲在46J

DIVIDE I BY 10 GIVING J. 
DIVIDE J BY 100 GIVING ignored REMAINDER J. 
+0

我不敢相信我正在回答COBOL問題。 8)}如果有更清晰的方法來計算餘數(在其他語言中爲'mod'或'%'運算符),我很樂意看到它。 –

5

什麼基思·湯普森建議將正常工作。您可能需要檢查I> 0和J> 0.如果您始終知道總是1000 < = I < = 9999,那麼這不會成爲問題。

IBM Enterprise COBOL包含一個MOD function,它可能或可能不適用於您的編譯器。

我想你也可以做到以下幾點...

01 A-GROUP. 
    05 A-NUMBER PIC 9999 VALUE ZEROES. 
    05 A-STRING REDEFINES A-NUMBER. 
     10 FILLER PIC X. 
     10 THE-MIDDLE-TWO-DIGITS PIC XX. 
     10 FILLER PIC X. 

MOVE your-number TO A-NUMBER. 

這應該工作,你的號碼是否被定義爲COMP或COMP-3,只要0 < =您的號碼< = 9999

+0

爲了清晰和正確,我將「PIC X」改爲「FILLER PIC X」。否則,很好的答案! – Philip

+0

自1985年以來,「FILLER」至少在主機COBOL中不再需要。 – cschneid

5

您可以使用參考修改。考慮以下內容:

1 WS-MY-FIELD Pic X(4). 
1 WS-TGT-FIELD Pic X(2). 
... 
Move WS-MY-FIELD (2:2) to WS-TGT-FIELD 

第一個數字表示開始位置(基於1),第二個數字表示長度。

0
01 a-long-piece-of-data. 
    05 the-first-character pic x. 
    05 the-two-characters-we-want pic xx. 
    05 the-last-character pic x. 

01 a-short-piece-of-data pic xx. 
01 filler redefines a-short-piece-of-data. 
    05 a-short-unsigned-number pic 99. 

MOVE the-two-characters-we-want TO a-short-piece-of-data 
MOVE/ADD/COMPUTE/whatever a-short-unsigned-number 

或 MOVE到哪裏

有一個簽名的數量和要保留的符號的短片-的數據?

01 a-long-number PIC S9(4). 
01 FILLER REDEFINES a-long-number. 
    05 FILLER PIC X. 
    05 an-integer-with-one-decimal-place PIC S99V9. 

01 a-short-number-no-decimals PIC S99. 

MOVE an-integer-with-one-decimal-place TO a-short-number-no-decimals 
相關問題