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

Converting from alpha to numeric with decimals fails

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

Input: '6000'

Output. 60.00

所以我尝试了 %dec() BIF,它将输入作为 alpha、精度和小数位。但是当尝试这个时:

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'

以外的小数位

Alpha 6000 变为 Numeric 中的 6000.00,这是正确的。

如果您想将最后 2 位数字解释为十进制,则必须在字符串中添加 .

str = %subst(alphanumeric: 1: %len(alphanumeric)-3) + '.' + %subst(alphanumeric: %len(alphanumeric)-2: 2)

然后将新字符串转换成数字。

您也可以使用嵌入式 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 
                  )

获得 60.00 的另一种方法是将结果乘以 .01。

numeric = %dec(alphanumeric:13:0) * .01;

%DEC 的长度和小数位不用于指定如何解释字符值,它们仅用于设置结果的大小。如果字符值为 '6000',%DEC 的结果总是 6000,但根据 %DEC 的长度和小数位数,它可能是 006000.000 或 6000.00 等

我知道的唯一简单的方法是将免费的和好的旧的混合 rpg-syntax:

  EvalR VarText = '6000';
C                   Move      VarText       VarDec

使用移动,您可以轻松地将右调整值转移到数字字段

为了完整起见,您也可以使用数据结构来进行转换。但是,当您这样做时,转换并不那么明确。

**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