--带小数的整数转化成英文表示
create or replace function spell_number( p_number in number )
return varchar2
as
type myArray is table of varchar2(255);
l_str myArray := myArray( '',
' THOUSAND ', ' MILLION ',
' BILLION ', ' TRILLION ',
' QUADRILLION ', ' QUINTILLION ',
' SEXTILLION ', ' SEQTILLION ',
' OCTILLION ', ' NONILLION ',
' DECILLION ', ' UNDECILLION ',
' DUODECILLION ' );
l_num varchar2(50) default trunc( p_number );
l_return varchar2(4000);
begin
for i in 1 .. l_str.count
loop
exit when l_num is null;
if ( substr(l_num, length(l_num)-2, 3) <> 0 )
then
l_return := to_char(
to_date(
substr(l_num, length(l_num)-2, 3),
'J' ),
'JSP' ) || l_str(i) || l_return;
end if;
l_num := substr( l_num, 1, length(l_num)-3 );
end loop;
-- beginning of section added to include decimal places:
if to_char( p_number ) like '%.%'
then
l_num := substr( to_char(p_number,
'9999999999999999999999999.99')
, instr( to_char(p_number,
'9999999999999999999999999.99'), '.' )+1 ,2);
if l_num > 0
then
if l_num <> '00'
then
l_return := l_return || ' AND CENT ';
l_return := l_return || to_char(to_date(l_num,'J' ),'JSP' );
end if;
end if;
end if;
-- end of section added to include decimal places
return l_return || ' ONLY ';
end spell_number;
运行结果:
select spell_number(19203344.76) from dual
返回
NINETEEN MILLION TWO HUNDRED THREE THOUSAND THREE HUNDRED FORTY-FOUR AND CENT SEVENTY-SIX ONLY