54 lines
2 KiB
Text
54 lines
2 KiB
Text
declare integer_names (0:20) character (9) varying static initial
|
|
('zero', 'one', 'two', 'three', 'four', 'five', 'six',
|
|
'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve',
|
|
'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen',
|
|
'eighteen', 'nineteen', 'twenty' );
|
|
declare x(10) character (7) varying static initial
|
|
('ten', 'twenty', 'thirty', 'fourty', 'fifty',
|
|
'sixty', 'seventy', 'eighty', 'ninety', 'hundred');
|
|
declare y(0:5) character (10) varying static initial
|
|
('', '', ' thousand ', ' million ', ' billion ', ' trillion ');
|
|
declare (i, j, m, t) fixed binary (31);
|
|
declare (units, tens, hundreds, thousands) fixed binary (7);
|
|
declare (h, v, value) character (200) varying;
|
|
declare (d, k, n) fixed decimal (15);
|
|
declare three_digits fixed decimal (3);
|
|
|
|
value = '';
|
|
i = 5;
|
|
k = n;
|
|
do d = 1000000000000 repeat d/1000 while (d > 0);
|
|
i = i - 1;
|
|
three_digits = k/d;
|
|
k = mod(k, d);
|
|
if three_digits = 0 then iterate;
|
|
|
|
units = mod(three_digits, 10);
|
|
t = three_digits / 10;
|
|
tens = mod(t, 10);
|
|
hundreds = three_digits / 100;
|
|
m = mod(three_digits, 100);
|
|
if m <= 20 then
|
|
v = integer_names(m);
|
|
else if units = 0 then
|
|
v = '';
|
|
else
|
|
v = integer_names(units);
|
|
if tens >= 2 & units ^= 0 then
|
|
v = x(tens) || v;
|
|
else if tens > 2 & units = 0 then
|
|
v = v || x(tens);
|
|
|
|
if units + tens = 0 then
|
|
if n > 0 then v = '';
|
|
if hundreds > 0 then
|
|
h = integer_names(hundreds) || ' hundred ';
|
|
else
|
|
h = '';
|
|
if three_digits > 100 & (tens + units > 0) then
|
|
v = 'and ' || v;
|
|
if i = 1 & value ^= '' & three_digits <= 9 then
|
|
v = 'and ' || v;
|
|
value = value ||h || v || y(i);
|
|
end;
|
|
put skip edit (trim(N), ' = ', value) (a);
|