我必须将字母数字值转换为带小数位的数字值:
输入:“ 6000”
输出。 60.00
因此,我尝试了%dec()
BIF,该BIF将输入作为字母,精度和小数位。但是,当尝试这样做时:
dcl-s alphanumeric char(13);
dcl-s numeric packed(13:2);
alphanumeric = '6000';
numeric = %dec(alphanumeric:13:2);
*inlr = *on;
转换产生NUMERIC = 00000006000.00
而不产生NUMERIC = 000000060.00
。那我在做什么错了?
即使使用zoned(13:2)
代替packed(13:2)
,该值也没有'00'
以外的小数位
答案 0 :(得分:2)
获得60.00的另一种方法是将结果乘以.01。
numeric = %dec(alphanumeric:13:0) * .01;
%DEC的长度和小数位不用于指定如何解释字符值,它们仅用于设置结果的大小。如果字符值为'6000',则%DEC的结果始终为6000,但是取决于%DEC的长度和小数,可能为006000.000或6000.00,等等。
答案 1 :(得分:1)
我知道的唯一简单方法是将免费代码与旧的rpg语法免费混合在一起:
EvalR VarText = '6000';
C Move VarText VarDec
通过移动,您可以轻松地将右调整值转移到数字字段
答案 2 :(得分:1)
仅出于完整性考虑,您还可以使用数据结构进行转换。但是,当您执行此操作时,转换并不那么明确。
**free
dcl-ds *n;
charfld char(6);
numfld zoned(6: 2) Pos(1);
end-ds;
evalr charfld = '6000';
dsply %char(numfld);
return;
Display Program Messages Job 499369/XXXXXXX/QPADEV0011 started on 05/29/19 at 08:31:13 in subsystem Q DSPLY 60.00
答案 3 :(得分:0)
字母6000
变成数字中的6000.00
是正确的。
如果您想解释小数点后两位数字,则只能在字符串中输入.
。
str = %subst(alphanumeric: 1: %len(alphanumeric)-3) + '.' + %subst(alphanumeric: %len(alphanumeric)-2: 2)
然后将新字符串转换为数字。
您还可以使用EMBEDDED SQL:
EXEC SQL
SET :NEW_STRING = (
SELECT
DECIMAL( substr(:alphanumeric, 1, LENGTH(:alphanumeric)-3)
CONCAT '.'
CONCAT substr(:alphanumeric, LENGTH(:alphanumeric)-2, 2),
13, 2)
FROM
sysibm.sysdummy1
)