从字母转换为带小数的数字失败
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
我必须将字母数字值转换为带小数位的数值:
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