之前因公司业务需求,需要将录入的汉字自动转为阿拉伯数字存放到数据库中,网上有好多阿拉伯数字转为汉字的且正确的。但是汉字转为阿拉伯数字的却很少有正确的 。下面是正确的oracle函数,可正确转换汉字。(可转14位数左右,更大的数转换会有问题。)
create or replace function chineseTonum (chival IN VARCHAR2) return number
as
type str_array is table of varchar2(10) index by binary_integer;
type num_array is table of number index by binary_integer;
type num_map is table of number index by varchar2(10);
rmb_numbers num_map;
unit_numbers str_array;
big_unit_numbers str_array;
unit_val_numbers num_array;
result Number :=0;
i integer;
ind integer := -1;
money VARCHAR2(200) ;
pre_money VARCHAR2(200) ;
n Number;
begin
rmb_numbers('一') := 1;
rmb_numbers('二') := 2;
rmb_numbers('三') := 3;
rmb_numbers('四') := 4;
rmb_numbers('五') := 5;
rmb_numbers('六') := 6;
rmb_numbers('七') := 7;
rmb_numbers('八') := 8;
rmb_numbers('九') := 9;
rmb_numbers('零') := 0;
rmb_numbers('壹') := 1;
rmb_numbers('贰') := 2;
rmb_numbers('叁') := 3;
rmb_numbers('肆') := 4;
rmb_numbers('伍') := 5;
rmb_numbers('陆') := 6;
rmb_numbers('柒') := 7;
rmb_numbers('捌') := 8;
rmb_numbers('玖') := 9;
rmb_numbers('整') := 0;
unit_numbers(1) := '亿';
unit_numbers(2) := '万';
unit_numbers(3) := '千';
unit_numbers(4) := '百';
unit_numbers(5) := '十';
unit_numbers(6) := '元';
unit_numbers(7) := '角';
unit_numbers(8) := '分';
unit_numbers(9) := '厘';
big_unit_numbers(1) := '億';
big_unit_numbers(2) := '萬';
big_unit_numbers(3) := '仟';
big_unit_numbers(4) := '佰';
big_unit_numbers(5) := '拾';
big_unit_numbers(6) := '圆';
big_unit_numbers(7) := '角';
big_unit_numbers(8) := '分';
big_unit_numbers(9) := '厘';
unit_val_numbers(1) := 100000000;
unit_val_numbers(2) := 10000;
unit_val_numbers(3) := 1000;
unit_val_numbers(4) := 100;
unit_val_numbers(5) := 10;
unit_val_numbers(6) := 1;
unit_val_numbers(7) := 0.1;
unit_val_numbers(8) := 0.01;
unit_val_numbers(9) := 0.001;
money:= chival;
if (money is null ) then
return result;
end if;
-- 9 是计量单位的长度
for i in 1..unit_numbers.count loop
ind := instr(money, unit_numbers(i), -1 , 1);
if ( ind = 0 ) then
ind := instr(money, big_unit_numbers(i), -1 , 1);
end if;
if ( ind > 0 ) then
pre_money := substr(money,1,ind -1);
money := substr(money,ind + 1);
if ( pre_money is null and unit_val_numbers(i) = 10 ) then
result := result + unit_val_numbers(i);
else
result := result + chi2num(pre_money) * unit_val_numbers(i);
end if;
end if;
end loop;
if (money is not null ) then
n := rmb_numbers(money);
if ( n is not null) then
result := result + n;
end if;
end if;
return result;
end;