如何在COBOL中将字母数字字符串转换为数字小数

时间:2010-03-28 13:06:10

标签: cobol mainframe

例如,我有字母数字字符串'ABCDEF 0 0.450',我需要得到'0.450'作为数字小数并对其进行算术运算。我们有办法吗?请建议。

4 个答案:

答案 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)