Oracle存储过程实现人民币大小写转换

Oracle存储过程实现人民币大小写转换1

原文地址:http://bbs.csdn.net/topics/390248521

--调用存储过程

select num2rmb(3454645435345123.45) RMB from dual;

create or replace function num2rmb(je number) return varchar2 is

  result varchar2(100);

  i      pls_integer;

  snum   varchar2(20) := ltrim(replace(to_char(abs(je),

                                               '9999999999999990.99'),

                                       '.'));

  len    pls_integer := length(snum);

  sch    varchar2(20) := '零壹贰叄肆伍陆柒捌玖';

  sjin   varchar2(50) := '分角圆拾佰仟万拾佰仟亿拾佰仟万拾佰仟';

  srmb   varchar2(100) := '';

  num    Pls_Integer;

  jin    varchar(2);

  s_num  pls_integer := 0; --0起始位置

  e_num  pls_integer := 0; --0结束位置

Oracle存储过程实现人民币大小写转换2

begin

  for in 1 .. len loop

    num := to_number(substr(snum, i, 1));

    if num <> 0 then

      --非‘0’时处理

      if s_num = 0 then

        srmb := srmb || substr(sch, num + 1, 1) ||

                substr(sjin, len - i + 1, 1);

        --前面字符非0时,正常连接。。。

      else

        srmb := srmb || --否则

                case

                  when s_num = e_num then --前面只有一个0

                   case s_num

                     when then

                      '万' --只处理进位

                     when 11 then

                      '亿'

                     when 15 then

                      '万'

                   end

                  when e_num < 12 then --否则多个0处理

                   case

                     when s_num < 7 then

                      '' --一万以内。。。

                     when s_num < 11 then

                      case

                        when e_num < 8 and s_num < 10 then

                         '万'

                      end

                     when s_num < 15 then

                      case

                        when e_num < 12 then

                         '亿'

                      end

                     else

                      '万亿'

                   end

                  when e_num < 16 and s_num > 14 then

                   '万'

                end || case

                  when s_num > 3 and e_num < 3 then

                   '圆零'

                  when e_num = 3 then

                   '圆'

                  when e_num not in (7, 11, 15) or s_num - e_num > 2 then

                   '零'

                end;

        srmb := srmb || substr(sch, num + 1, 1) ||

                substr(sjin, len - i + 1, 1);

      end if;

      s_num := 0;

      e_num := 0;

    else

      if s_num = 0 then

        --当s_num=0时0串起始

        s_num := len - i + 1; --记录开始

        e_num := s_num;

      else

        e_num := len - i + 1;

      end if;

    end if;

  end loop;

  if s_num <> 0 then

    --此时以0结尾

    srmb := srmb || case

              when s_num = len then

               '零圆整' --全0串,加。。。

              when s_num = 1 or s_num = 2 then

               '整' --分(1),角(2)后加。。。

              when s_num < 7 or s_num = 10 then

               '圆整'

              when s_num < 11 then

               '万圆整'

              when s_num < 15 then

               '亿圆整'

              else

               '万亿圆整'

            end;

  else

    srmb := srmb || '整'--不以0结尾,加...

  end if;

  if je < 0 then

    srmb := '负' || srmb;

  end if;

  return srmb;

end num2rmb;

猜你喜欢

转载自blog.csdn.net/tanzongbiao/article/details/82455127
今日推荐