阅读背景:

oracle 金额大写转换

来源:互联网 
FUNCTION convert_money(input_number NUMBER) RETURN VARCHAR2 IS
  i     PLS_INTEGER;
  snum  VARCHAR2(20) := ltrim(REPLACE(to_char(abs(input_number), '9999999999999990.99'), '.'));
  len   PLS_INTEGER := length(snum);
  sch   VARCHAR2(30) := '零壹贰叁肆伍陆柒捌玖';
  sjin  VARCHAR2(60) := '分角圆拾佰仟万拾佰仟亿拾佰仟万拾佰仟';
  srmb  VARCHAR2(200) := '';
  num   PLS_INTEGER;
  s_num PLS_INTEGER := 0; --'0'起始位置
  e_num PLS_INTEGER := 0; --'0'结束位置
BEGIN
  IF input_number IS NULL THEN
    RETURN NULL;
  END IF;
  FOR i 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 7 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 input_number < 0 THEN
    srmb := '负' || srmb;
  END IF;
  RETURN srmb;
END;
FUNCTION convert_money(input_number NUMBER) RET



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: