ORACLE转中文大写金额

CREATE OR REPLACE FUNCTION num_to_cn_capital(amount IN NUMBER)
  RETURN VARCHAR2 IS
  -- 定义数字和对应大写
  nums          VARCHAR2(30) := '零壹贰叁肆伍陆柒捌玖'; --10*3
  units         VARCHAR2(39) := '万仟佰拾亿仟佰拾万仟佰拾元'; --13*3
  small_cents   VARCHAR2(6) := '角分';
  strnum        VARCHAR2(1000);
  result_amount VARCHAR2(4000) := '';
  part          VARCHAR2(1000);
  digit         NUMBER(25, 6);
  unit_pos      INTEGER;
BEGIN

  IF amount < 0 THEN
    RETURN '负' || num_to_cn_capital(-amount);
  END IF;

  -- 转换整数部分
  strnum := to_char(round(floor(amount)));
  IF strnum = '0' THEN
    result_amount := '零';
  ELSE
    IF strnum IS NOT NULL THEN
      FOR i IN REVERSE 1 .. length(strnum) LOOP
        part          := substr(strnum, length(strnum) + 1 - i, 1);
        digit         := to_number(part);
        unit_pos      := length(units) - i;
        result_amount := result_amount || substr(nums, digit + 1, 1) ||
                         substr(units, unit_pos + 1, 1);
      END LOOP;
    ELSE
      result_amount := '零';
    END IF;
  END IF;

  result_amount := REPLACE(result_amount, '元', '');
  result_amount := REPLACE(result_amount, '拾零', '拾');
  result_amount := REPLACE(result_amount, '佰零', '佰');
  result_amount := REPLACE(result_amount, '仟零', '仟');
  result_amount := REPLACE(result_amount, '佰拾', '佰');
  result_amount := REPLACE(result_amount, '仟佰', '仟');

  -- 转换小数部分
  part := round((amount - floor(amount)) * 100);
  IF part != 0 THEN
    result_amount := result_amount || '.';
    strnum        := to_char(part);
    IF length(strnum) = 1 THEN
      result_amount := result_amount || '零';
    END IF;
    FOR i IN 1 .. length(strnum) LOOP
      digit         := to_number(substr(strnum, i, 1));
      result_amount := result_amount ||
                       REPLACE(substr(nums, digit + 1, 1), '零', '');
      --SUBSTR(small_cents, i, 1) 角分
    END LOOP;
  END IF;

  RETURN result_amount;
END;

示例(函数不含角分,可自行添加)

SELECT num_to_cn_capital(738829.70) from dual

输出结果

柒拾叁万捌仟捌佰贰拾玖.

含单位的金额大写

CREATE OR REPLACE FUNCTION num_to_cn_capital_dw(amount IN NUMBER)
  RETURN VARCHAR2 IS
  -- 定义数字和对应大写
  nums          VARCHAR2(30) := '零壹贰叁肆伍陆柒捌玖'; --10*3
  units         VARCHAR2(39) := '万仟佰拾亿仟佰拾万仟佰拾圆'; --13*3
  small_cents   VARCHAR2(6) := '角分';
  strnum        VARCHAR2(1000);
  result_amount VARCHAR2(4000) := '';
  part          VARCHAR2(1000);
  digit         NUMBER(25, 6);
  unit_pos      INTEGER;
BEGIN

  IF amount < 0 THEN
    RETURN '负' || num_to_cn_capital_dw(-amount);
  END IF;

  -- 转换整数部分
  strnum := to_char(round(floor(amount)));
  IF strnum = '0' THEN
    result_amount := '零';
  ELSE
    IF strnum IS NOT NULL THEN
      FOR i IN REVERSE 1 .. length(strnum) LOOP
        part          := substr(strnum, length(strnum) + 1 - i, 1);
        digit         := to_number(part);
        unit_pos      := length(units) - i;
        result_amount := result_amount || substr(nums, digit + 1, 1) ||
                         substr(units, unit_pos + 1, 1);
      END LOOP;
    ELSE
      result_amount := '零';
    END IF;
  END IF;

  --result_amount := REPLACE(result_amount, '元', '');
  result_amount := REPLACE(result_amount, '拾零', '拾');
  result_amount := REPLACE(result_amount, '佰零', '佰');
  result_amount := REPLACE(result_amount, '仟零', '仟');
  result_amount := REPLACE(result_amount, '佰拾', '佰');
  result_amount := REPLACE(result_amount, '仟佰', '仟');

  -- 转换小数部分
  part := round((amount - floor(amount)) * 100);
  IF part != 0 THEN
    strnum := to_char(part);
    IF length(strnum) = 1 THEN
      result_amount := result_amount || '零';
    END IF;
    FOR i IN 1 .. length(strnum) LOOP
      digit         := to_number(substr(strnum, i, 1));
      result_amount := result_amount ||
                       REPLACE(substr(nums, digit + 1, 1), '零', '') ||
                       substr(small_cents, i, 1);
      --SUBSTR(small_cents, i, 1) 角分
    END LOOP;
  END IF;

  RETURN result_amount;
END;

示例

SELECT num_to_cn_capital_dw(21544.92) from dual

输出结果

贰万壹仟伍佰肆拾肆圆玖角贰分
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle中,可以使用以下函数将金额换为大写: ```sql CREATE OR REPLACE FUNCTION num_to_chinese(num IN NUMBER) RETURN VARCHAR2 IS str_num VARCHAR2 (50) DEFAULT TO_CHAR (num); len NUMBER := LENGTH (str_num); units CONSTANT VARCHAR2 (20) := '零壹贰叁肆伍陆柒捌玖'; tens CONSTANT VARCHAR2 (20) := '零拾佰仟'; big_units CONSTANT VARCHAR2 (20) := '零万亿兆京垓'; result VARCHAR2 (100) := ''; cur_unit VARCHAR2 (1); prev_unit VARCHAR2 (1); i NUMBER; digit NUMBER; prev_digit NUMBER; BEGIN IF num = 0 THEN RETURN '零'; END IF; FOR i IN 1 .. len LOOP digit := TO_NUMBER (SUBSTR (str_num, i, 1)); IF digit = 0 THEN IF MOD (i - 1, 4) = 0 THEN cur_unit := SUBSTR (big_units, i / 4 + 1, 1); IF cur_unit <> prev_unit THEN result := result || cur_unit; prev_unit := cur_unit; END IF; END IF; IF MOD (i - 1, 4) <> 0 AND prev_digit <> 0 THEN result := result || '零'; END IF; ELSE cur_unit := SUBSTR (tens, MOD (i - 1, 4) + 1, 1); IF cur_unit <> prev_unit THEN result := result || cur_unit; prev_unit := cur_unit; END IF; result := result || SUBSTR (units, digit + 1, 1); IF MOD (i - 1, 4) = 0 THEN cur_unit := SUBSTR (big_units, i / 4 + 1, 1); IF cur_unit <> prev_unit THEN result := result || cur_unit; prev_unit := cur_unit; END IF; END IF; END IF; prev_digit := digit; END LOOP; RETURN result; END; ``` 然后,您可以使用以下SQL语句将金额换为大写: ```sql SELECT num_to_chinese(123456789.12) FROM dual; ``` 输出: ``` 壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元壹角贰分 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值