数字汉字转换

**********************************************
– FUNCTION NAME:
– CONVERT_MONEY

– DESCRIPTION:
– 将“阿拉伯数字”转换成“大写汉字”

**********************************************

FUNCTION convert_money(input_nbr IN NUMBER DEFAULT 0) RETURN VARCHAR2 IS
    --
    num_character  VARCHAR2(100) := '零壹贰叁肆伍陆柒捌玖';
    unit_character VARCHAR2(300) := '分角圆拾佰仟万拾佰仟亿拾佰仟万拾佰仟亿';
    output_string  VARCHAR2(500) := '';
    remain_nbr     NUMBER(20);
    input_nbr_bak  NUMBER(30); -- 用于接收输入参数 INPUT_NBR
    bit_num        NUMBER(20); -- 每一位上的数字
    bit_unit       VARCHAR2(20); -- 每一位所对的单位
    bit_indic      NUMBER(3) := 0; -- 每一位的数字是否为0,0表示为0,1表示不为0
    i              NUMBER(2) := 0; -- 循环次数,索引变量从0开始
    spe_unit       VARCHAR2(30) := 'A'; -- 特殊位,包括万和亿,表示该亿汉字是否已写入结果字串
    sign_indic     VARCHAR2(1); -- 用于标志数值符号:0为正,1为负
    --
  BEGIN
    --
    IF input_nbr = 0 THEN
      RETURN '零圆整';
    ELSIF input_nbr > 0 THEN
      sign_indic    := '0';
      input_nbr_bak := input_nbr;
    ELSIF input_nbr < 0 THEN
      sign_indic    := '1';
      input_nbr_bak := -input_nbr;
    END IF;
    --
    LOOP
      --
      remain_nbr    := floor(input_nbr_bak / 10); -- 取出除后的商
      bit_num       := input_nbr_bak - remain_nbr * 10; -- 取出当前位的数值
      input_nbr_bak := remain_nbr; -- 保存商以做下一次循环
      bit_unit      := rtrim(substr(unit_character, i * 1 + 1, 1)); -- 取出当前位的单位汉字
      --
      IF bit_num > 0 THEN
        --
        bit_indic := 1;
        --
        IF i = 6 OR i = 14 THEN
          spe_unit := '万';
        ELSIF (i >= 7 AND i <= 9) OR (i >= 15 AND i <= 17) THEN
          --
          IF spe_unit != '万' THEN
            output_string := '万' || output_string;
            spe_unit      := '万';
          END IF;
          --
        END IF;
        --
        output_string := substr(num_character, bit_num * 1 + 1, 1) ||
                         bit_unit || output_string;
        --
      ELSE
        --
        IF bit_indic = 1 THEN
          output_string := '零' || output_string;
        END IF;
        --
        IF bit_unit IN ('圆', '亿') THEN
          spe_unit      := bit_unit;
          output_string := bit_unit || output_string;
        END IF;
        --
        bit_indic := 0;
        --
      END IF;
      --
      i := i + 1;
      --
      EXIT WHEN input_nbr_bak = 0;
      --
    END LOOP;
    --
    -- ****************************
    -- 输入的数字没有分,最小的是角,则尾部串个整
    -- ****************************
    IF MOD(input_nbr, 10) = 0 THEN
      output_string := output_string || '整';
    END IF;
    --
    IF sign_indic = '1' THEN
      output_string := '负' || output_string;
    END IF;
    --
    RETURN output_string;
    --
  END convert_money;

猜你喜欢

转载自blog.csdn.net/lzl1101206656/article/details/80536759
今日推荐