1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| create or replace function F_upper_money(p_num in number default null) return nvarchar2 is
Result nvarchar2(100); num_round nvarchar2(100) :=to_char(abs(round(p_num,2))); num_left nvarchar2(100); num_right nvarchar2(2); str1 nchar(10) :='零壹贰参肆伍陆柒捌玖'; str2 nchar(16) :='元拾佰仟万拾佰仟亿拾佰仟万拾佰仟'; num_pre number(1):=1; num_current number(1); num_count number:=0;
begin if p_num is null then return null;end if;
select to_char( nvl(substr(to_char(num_round),1, decode(instr(to_char(num_round),'.'),0, length(num_round),instr(to_char(num_round),'.')-1)), 0)) into num_left from dual; select substr(to_char(num_round), decode(instr(to_char(num_round),'.'),0, length(num_round)+1,instr(to_char(num_round),'.')+1),2) into num_right from dual;
if length(num_left)>16 then return '**********'; end if;
if length(num_right)=2 then if to_number(substr(num_right,1,1))=0 then result:='零'||substr(str1,to_number(substr(num_right,2,1))+1,1)||'分'; else result:=substr(str1,to_number(substr(num_right,1,1))+1,1)||'角'|| substr(str1,to_number(substr(num_right,2,1))+1,1)||'分'; end if; elsif length(num_right)=1 then result:=substr(str1,to_number(substr(num_right,1,1))+1,1)||'角整'; else result :='整'; end if; for i in reverse 1..length(num_left) loop num_count:=num_count+1; num_current:=to_number(substr(num_left,i,1)); if num_current>0 then result:=substr(str1,num_current+1,1)||substr(str2,num_count,1)||result; else if mod(num_count-1,4)=0 then result:=substr(str2,num_count,1)||result; num_pre:=0; end if; if num_pre>0 or length(num_left)=1 then result:=substr(str1,num_current+1,1)||result; end if; end if; num_pre:=num_current; end loop; if p_num<0 then result:='负'||result; end if; return Result; exception when others then raise_application_error(-20001,'数字转换大写出现错误!'||sqlerrm); end ;
|