如何在COBOL中将字母数字字符串转换为数字十进制

如何在COBOL中将字母数字字符串转换为数字十进制,cobol,mainframe,Cobol,Mainframe,例如,我有字母数字字符串'abcdef0.450',我需要得到'0.450'作为数字小数,并对其进行算术运算。我们有办法吗?请提出建议。我假设格式不是固定的,因为您可以选择字符串的这一部分,然后将其移动到用pic 9.999定义的字段中,并从那里使用它 这假设字符串值由3部分组成,由空格分隔。首先定义一些字段: 1 part1 pic x(14). 1 part2 pic x(14). 1 part3 pic x(07). 1

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

我假设格式不是固定的,因为您可以选择字符串的这一部分,然后将其移动到用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).
后缀来自我的命名约定,表示字母数字值。如果字符串输入可能较长,请根据需要增加大小

代码的其余部分将字符串解析为值


当心,我还没有通过编译器运行这个

通常,我可以找到一种实现它的方法

如上所述,解串和组合不起作用,但重新定义了作品

将字母数字字符串重新定义为两个数字字段,以分别保存和处理小数部分和整数部分。至少将十进制总数除以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。希望你能弄明白


并请建议任何其他方法来实现同样的目标

在大多数现代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进行计算

例如,我有字母数字字符串 “ABCDEF 0.450”我需要 “0.450”作为数字小数点和do 算数。我们有办法吗? 请建议

如果您在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)

您不想看到零('ABCDEF 0.450')?如果不是,我们如何区分你想“看到”的数字和你不想看到的数字?Neal,有人明确提到“我需要将'0.450'作为数字小数,并对其进行算术运算。”。有了这一点,你应该得到回答。否则,请让我知道这是否不是您正在查看的.kweble,解除对一些非字符串变量的排序不起作用。我相信,接收字段也应该是字符串。你怎么说?一个输入错误,第一个接收字段应该是digitsAn而不是数字:将以“.”分隔的第3部分解压为digitsAn小数。你不能像这样定义字段小数并在计算中使用它。应该是V999。无论如何,我知道编译器。是的,对于固定格式,定义相应的结构。我怀疑你需要重新定义这个领域。WS-NUM-STR由pic x(9)的虚拟字段和pic 9.999的值字段组成,怎么样?因为我对数字字段很感兴趣,所以没有考虑填充符,而是在上面进行了更新。用PIC 9.999的值字段来重新定义是不起作用的,因为9.999是一种图片编辑类型,它对于显示/输出非常有用,并且仍然无法执行所需的算法。让我知道你的想法。你不需要除以1000。只需将WS-DEC-PART定义为PICV999并添加。如果这样做的话,你应该检查小数点是否是小数点,你应该检查你的数字字段是否是数字。我尝试了同样的方法,但没有成功。另外,我还得到了一张7美元的支票。所以我不得不走另一条路。。无论如何,感谢您的关注和回复Gilbert将其移动到数字字段的问题是ABCDEF实际上是有效的分区十进制数字。如果没有空格,ABCDEF不会给您带来问题,但不会给您预期的结果,因为将错误地解释为数字。通过在中间算术字段上产生SOC7(数字异常),空格真的帮了你一个忙。Raja,如果做得正确,就像Gilbert的一样,我看不出你将如何处理S0C7。任何其他读者,这是一个解决方案,它将在固定位置处理数据。Joe,它是WS-Edit-NUMBER,来自正在移动的重定义,因此没有空格。空格也很擅长将自己“伪装”为“分区”/“显示”数字(零),当它们进入最右边字节最左边的“半”时,它们“可能”(取决于其他情况)会导致S0C7。这类似于在小数点周围手动移动数字字段。''右!谢谢你的时间。。。
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)