将汉字转为阿拉伯数字(oracle函数方式)

之前因公司业务需求,需要将录入的汉字自动转为阿拉伯数字存放到数据库中,网上有好多阿拉伯数字转为汉字的且正确的。但是汉字转为阿拉伯数字的却很少有正确的 。下面是正确的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;

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值