2010-03-28 122 views
2

例如,我使用字母數字字符串'ABCDEF 0 0.450',並且需要將數字「0.450」作爲數字小數進行運算。我們有辦法嗎?請建議。如何在COBOL中將字母數字字符串轉換爲數字小數

+0

你不希望看到的零(「ABCDEF ** 0 ** 0.450」 )?如果不是,我們如何區分你想要「看到」的數字和那些你不想看到的數字? – NealB 2010-03-29 14:34:17

+0

Neal,明確提到「我需要得到'0。450'作爲數字小數,並對其進行算術運算「,這樣你就應該回答了,否則請讓我知道你是不是正在查看。 – 2010-03-31 03:03:04

回答

1

通常情況下,我可以找到一種方法來實現它!

如上所述,UNSTRINGing和組合並沒有工作,但REDEFINES的作品!

將字母數字字符串重新定義爲兩個數字字段,以分別保存和處理小數部分和整數部分。 Atlast將十進制總數除以1000並將其添加到整數部分。而已!代碼片段遵循...

01 WS-NUM-STR  PIC X(14) VALUE 'ABCDEF 0 0.450'. 
01 WS-NUM-STR-MOD REDEFINES WS-NUM-STR. 
    05 FILLER  PIC X(9). 
    05 WS-INT-PART PIC 9. 
    05 FILLER  PIC X. 
    05 WS-DEC-PART PIC 999. 

---------- 
---------- 

* CODE TO ADD ALL INTEGER PARTS 
* CODE TO ADD ALL DECIMAL PARTS 
    COMPUTE = INTEGER-TOTAL + (DECIMAL-TOTAL/1000) 

注:正如我已經知道了小數部分有3個數字,我的1000希望你能想出分十進制TOTAL。

並請建議任何其他方式來實現相同!

+0

是的,對於一個固定的格式來定義一個相應的結構我懷疑你需要重新定義這個字段WS-NUM- STR由pic x(9)的虛擬字段和pic 9.999的值字段組成? – Kwebble 2010-04-04 22:10:48

+0

由於我對數字字段很感興趣,所以對填充符沒有任何疑問,但是已經在上面更新了。將要重新定義PIC 9.99的值字段9不起作用,因爲9.999是一種圖片編輯類型,它對顯示/輸出目的很有用,並且仍然無法執行所需的算術運算。勒米知道你在想什麼。 – 2010-04-06 17:06:45

+1

您不需要除以1000.只需將WS-DEC-PART定義爲PIC V999和ADD即可。如果這樣做,你應該檢查小數點是小數點,你應該檢查你的數字字段是數字。 – 2013-10-11 23:19:17

3

我認爲格式不固定,因爲那樣你就可以選擇那部分字符串並將它移動到圖9.999中定義的字段並從那裏使用它。

這裏假定字符串值由3個空格分隔的部分組成。首先定義某些字段:

1 part1  pic x(14). 
1 part2  pic x(14). 
1 part3  pic x(07). 

1 digitsAn. 
    2 digits pic 9(03). 
1 decimalsAn. 
    2 decimals pic .9(03). 

1 theValue pic 9(03)v9(3). 

後綴是從我的命名約定,並表示字母數字值。如果字符串輸入可能更長,則根據需要增加尺寸。

其餘代碼將theString分解爲該值

* Extract the third part. 
    initialize part3 
    unstring theString delimited by all spaces into part1 part2 part3 

* make sure the receiving field contains numeric data. 
    inspect part3 replacing spaces by zeroes 

* extract digits before and after the decimal point. 
    unstring part3 delimited by "." into digits decimalsAn(2:) 

* Combine parts before and after decimal points into a numeric value. 
    compute theValue = digits + decimals 

請注意,我沒有通過編譯器運行它!

+0

Kwebble,UNSTRINGing進一些非STRING變量不起作用。 ,接收字段應該是'STRING',你怎麼說? – 2010-03-31 17:10:16

+0

一個錯字,第一個接收字段應該是digitsAn而不是數字:unstring part3用「。」分隔爲digitsAn decimalsAn(2 :) – Kwebble 2010-04-04 21:58:46

+0

你不能定義你的字段小數點就像這樣,並在COMPUTE中使用它應該是V999編譯器我知道無論如何 – 2013-10-11 23:17:29

1

在大多數現代的Cobol編譯器中,您可以將數字編輯的字段移動到數字字段。從下面的例子

借款:

01 WS-NUM-STR   PIC X(14) VALUE 'ABCDEF 0 0.450'. 
01 WS-NUM-STR-MOD  REDEFINES WS-NUM-STR. 
    05 FILLER   PIC X(9). 
    05 WS-EDITED-NUMBER PIC 9.999. 
01 WS-NUMBER   PIC 9V999. 

---------- 

MOVE WS-EDITED-NUMBER TO WS-NUMBER 

,然後做WS-NUMBER計算。

+0

我試過一樣,但沒有工作。更多的我得到了SOC7異常結果。所以必須去其他方式..無論如何感謝您的興趣和反應吉爾伯特 – 2010-05-15 15:45:16

+0

對不起,這不適合你的編譯器。 – 2010-05-16 00:05:33

+0

將它移動到數字字段的問題是ABCDEF實際上是有效的分區十進制數字。如果空格不存在,ABCDEF不會給你一個問題,但不會給你你期望的結果,因爲它會被錯誤地解釋爲數字。 通過在中間運算域上引發SOC7(數值異常),空間確實對您有利。 – 2010-06-09 01:54:33

1

對於例如,我有字母數字字符串 「ABCDEF 0 0.450」,我需要得到 「0.450」作爲數字小數和做它 算術。我們有辦法嗎? 請建議。

如果您正在CICS中運行,您可以使用BIF DEEDIT函數 - 這將使您留下「00.450」。

如果您沒有在CICS運行,假設你有你在一個名爲WS-STR場字符串:

Move 0 to JJ 
Perform varying II from 1 by 1 
until II > Length of WS-STR 

Evaluate WS-STR (II:1) 
    when '0' 
    when '1' 
    when '2' 
    when '3' 
    when '4' 
    when '5' 
    when '6' 
    when '7' 
    when '8' 
    when '9' 
    when '.' 
    Add 1 to JJ 
    Move WS-STR (II:1) to WS-NUM (JJ:1) 

* ---- Do nothing 
    when other 
    continue 

End-Perform 
Compute REAL-DEC-NUM = Function NUM-VAL (WS-NUM) 
+0

這類似於在小數點附近手動移動數字字段'。'對!謝謝你的時間... – 2010-06-08 15:43:09

相關問題