数字汉字转换

79 篇文章 1 订阅

**********************************************
– 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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值