阿拉伯数字金额转中文数字金额函数

create or replace function chinese_number_program(p_input float)
  return varchar2 as
  /*
  created by miki西游 on 2012-7-27
  It is used to change Arabic numbers to Chinese big numbers.
  */
  type typ_money is table of varchar2(20);
  c_numbers typ_money := typ_money('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
	c_unit typ_money := typ_money('分', '角', '圆', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟', '兆', '拾', '佰', '仟');
  v_array_money    typ_money := typ_money();
  chinese_number   varchar2(30);
  result           varchar2(1000);
  v_number         integer;
  v_number_element integer;
  i                int;
begin
  if (p_input >= power(10, 16)) then
    result := '超出计算范围';
    return result;
  end if;
  v_number := round(p_input * 100);
 
  i := 1;
  v_array_money.extend(1);
  v_array_money(v_array_money.count) := '整';
 
  while v_number > 0 loop
    v_number_element := mod(v_number, 10);
    if (v_number_element = 0) then
      if i in (3, 7, 11, 15) then
        chinese_number := c_unit(i);
      else
        chinese_number := c_numbers(v_number_element + 1);
      end if;
    else
      chinese_number := c_numbers(v_number_element + 1) || c_unit(i);
    end if;
  
    case
      when chinese_number = '零' then
        if (v_array_money(v_array_money.count) not in
           ('整', '零', '圆', '万', '亿', '兆')) then
          v_array_money.extend(1);
          v_array_money(v_array_money.count) := chinese_number;
        end if;
      when chinese_number like '%亿' then
        if (v_array_money(v_array_money.count) in ('万')) then
          v_array_money(v_array_money.count) := chinese_number;
        else
          v_array_money.extend(1);
          v_array_money(v_array_money.count) := chinese_number;
        end if;
      when chinese_number like '%兆' then
        if (v_array_money(v_array_money.count) in ('万', '亿')) then
          v_array_money(v_array_money.count) := chinese_number;
        else
          v_array_money.extend(1);
          v_array_money(v_array_money.count) := chinese_number;
        end if;
      else
        v_array_money.extend(1);
        v_array_money(v_array_money.count) := chinese_number;
    end case;
    v_number := floor(v_number / 10);
    i        := i + 1;
  end loop;
  for i in v_array_money.first .. v_array_money.last loop
    result := v_array_money(i) || result;
  end loop;
 
  return result;
end;


测试

select chinese_number_program(10029.3) as cc from dual

image.png

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

搜索
«   2019年11月   »
123
45678910
11121314151617
18192021222324
252627282930
最新留言
    标签列表

      Powered By Z-BlogPHP 1.5.2 Zero