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