"RPG400-L" <rpg400-l-bounces@xxxxxxxxxxxxxxxxxx> wrote on 03/06/2020
11:14:15 AM:
On Fri, Mar 6, 2020 at 10:55 AM <dlclark@xxxxxxxxxxxxxxxx> wrote:
"RPG400-L" <rpg400-l-bounces@xxxxxxxxxxxxxxxxxx> wrote on 03/05/2020
06:38:53 PM:
Brute force method???
Put a select in your procedure that has a %dec() with a hard-coded #
of decimals for each option you might want.
Ah! Good idea. Thanks.
To me, your original string processing *was* the brute force method.
This... to me feels like copy-pasting code. And the more different
d_shift values you have to support, the worse this becomes.
I do suspect this *might* be the best-performing approach. Even if it
is, I don't think the performance gains are worth the verbosification
(and calcification) of the code.
So are you saying that you would NOT like to see a service
procedure similar to the following to accomplish this?
// This procedure formats the result of a numeric expression as a
// variable-length numeric character string with the maximum scale
// requested. (Precision can be up to 46 and scale up to 15.)
dcl-proc Dec2CharFormat export;
dcl-pi *n varchar(50);
number_data zoned(46:15) const;
max_scale packed(2:0) const options(*nopass);
end-pi;
dcl-s use_scale like(max_scale);
if %parms < %parmnum(max_scale)
or %addr(max_scale) = *null;
use_scale = 0;
else;
use_scale = max_scale;
endif;
select;
when use_scale = 15;
return %char(%dech(number_data:46:15));
when use_scale = 14;
return %char(%dech(number_data:46:14));
when use_scale = 13;
return %char(%dech(number_data:46:13));
when use_scale = 12;
return %char(%dech(number_data:46:12));
when use_scale = 11;
return %char(%dech(number_data:46:11));
when use_scale = 10;
return %char(%dech(number_data:46:10));
when use_scale = 9;
return %char(%dech(number_data:46:9));
when use_scale = 8;
return %char(%dech(number_data:46:8));
when use_scale = 7;
return %char(%dech(number_data:46:7));
when use_scale = 6;
return %char(%dech(number_data:46:6));
when use_scale = 5;
return %char(%dech(number_data:46:5));
when use_scale = 4;
return %char(%dech(number_data:46:4));
when use_scale = 3;
return %char(%dech(number_data:46:3));
when use_scale = 2;
return %char(%dech(number_data:46:2));
when use_scale = 1;
return %char(%dech(number_data:46:1));
endsl;
return %char(%dech(number_data:46:0));
end-proc;
Sincerely,
Dave Clark
As an Amazon Associate we earn from qualifying purchases.