例如,我有字母数字字符串'ABCDEF 0 0.450',我需要得到'0.450'作为数字小数并对其进行算术运算。我们有办法吗?请建议。
答案 0 :(得分:3)
我认为格式不固定,因为那时你可以选择字符串的那一部分并将其移动到用pic 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).
An 后缀来自我的命名约定,并指示字母数字值。如果字符串输入可能更长,则根据需要增加大小。
其余代码将 theString 解析为 theValue 。
* 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
请注意,我没有通过编译器运行它!
答案 1 :(得分:1)
通常,我可以找到实现它的方法!
如上所述,UNSTRING和组合没有用,但REDEFINES有效!
将字母数字字符串重新定义为两个数字字段,以分别保存和处理小数部分和整数部分。 Atlast将decimal-total除以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位数,所以我将DECIMAL-TOTAL除以1000.希望你能搞清楚。
请建议任何其他方法来实现同样的目标!
答案 2 :(得分: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进行计算。
答案 3 :(得分: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)