Преобразование из алфавита в число с десятичными числами не удается - PullRequest
0 голосов
/ 27 мая 2019

Мне нужно преобразовать буквенно-цифровое значение в числовое значение с десятичными разрядами:

Ввод: '6000'

Вывод.60.00

Итак, я попробовал %dec() 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 ]

2 голосов
/ 27 мая 2019

Другой способ получить 60,00 - умножить результат на 0,01.

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

Длина и десятичные разряды для% DEC не используются, чтобы указать, как интерпретировать значение символа, они просто используются, чтобы установить размер результата. Если значение символа равно 6000, результат% DEC всегда равен 6000, но в зависимости от длины и десятичного числа% DEC это может быть 006000.000 или 6000.00 и т. Д.

1 голос
/ 29 мая 2019

Просто для полноты вы можете использовать структуру данных для преобразования. Но преобразование не так явно, когда вы делаете это.

**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                                                                
1 голос
/ 28 мая 2019

Единственный простой способ, который я знаю, - это микс из бесплатного старого доброго синтаксиса rpg:

  EvalR VarText = '6000';
C                   Move      VarText       VarDec

С помощью move вы можете легко перенести правильное значение в числовое поле

0 голосов
/ 27 мая 2019

Альфа 6000 становится 6000.00 в Числовом, это правильно.

Если вы хотите интерпретировать последние 2 цифры как десятичные, вы должны указать только . в вашей строке.

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 
                  )
...