从alpha转换为带小数的数字失败

时间:2019-05-27 10:55:52

标签: rpgle

我必须将字母数字值转换为带小数位的数字值:

  

输入:“ 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'以外的小数位

4 个答案:

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