oracle 数量大写函数

本文介绍了一个将阿拉伯数字转换为中文大写金额的Oracle PL/SQL函数。该函数能够处理整数和小数部分,并考虑了特殊情况如零的处理。通过使用不同的单位和数字对应的中文字符,实现了数字到中文金额的准确转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FUNCTION convert_quantity(p_digit IN NUMBER) RETURN VARCHAR2 IS
  l_left_str      VARCHAR2(100); ---左边字符串
  l_right_str     VARCHAR2(100); ---右边字符串
  l_unit_str      VARCHAR2(100); ---位
  l_number_str    VARCHAR2(100);
  l_vt            VARCHAR2(1000);
  l_vn            NUMBER;
  l_left_length   NUMBER; ---左边字符长度
  i               NUMBER;
  n               NUMBER;
  m               NUMBER;
  l_new_digit     NUMBER;
  l_speech        VARCHAR2(50);
  l_amount_format VARCHAR2(50);
BEGIN
 
  l_left_str   := NULL;
  l_right_str  := NULL;
  l_unit_str   := '拾佰仟万拾佰仟亿拾佰仟';
  l_number_str := '壹贰叁肆伍陆柒捌玖';
  m            := 1;
  l_new_digit  := to_char(p_digit);
  i            := 1;
  l_vt         := NULL;
 
  IF p_digit = 0 THEN
    RETURN '零';
  END IF;
 
  IF instr(l_new_digit, '.') = 0 THEN
    l_left_str  := l_new_digit;
    l_right_str := NULL;
  ELSIF instr(l_new_digit, '.') = 1 THEN
    l_speech    := '零';
    l_right_str := substr(l_new_digit, instr(l_new_digit, '.') + 1, length(l_new_digit) - instr(l_new_digit, '.'));
  ELSE
    l_left_str  := substr(l_new_digit, 1, instr(l_new_digit, '.') - 1);
    l_right_str := substr(l_new_digit, instr(l_new_digit, '.') + 1, length(l_new_digit) - instr(l_new_digit, '.'));
  END IF;
 
  IF l_left_str IS NOT NULL THEN
    l_left_length := length(l_left_str);
    IF l_left_length <= 8 THEN
      n := l_left_length;
      WHILE i <= l_left_length - 1 LOOP
        l_vn := to_number(substr(l_left_str, i, 1));
        IF l_vn >= 1 THEN
          IF m = 0 THEN
            l_vt := l_vt || '零';
          END IF;
          l_vt := l_vt || substr(l_number_str, l_vn, 1) || substr(l_unit_str, n - 1, 1);
          m    := 1;
        ELSE
          IF n = 5 THEN
            l_vt := l_vt || '万';
            m    := 1;
          ELSE
            m := 0;
          END IF;
        END IF; --end 零      
        i := i + 1;
        n := n - 1;
      END LOOP;
    
      l_vn := to_number(substr(l_left_str, l_left_length, 1));
      IF l_vn > 0 THEN
        IF m = 0 THEN
          l_vt := l_vt || '零';
        END IF;
        l_vt := l_vt || substr(l_number_str, l_vn, 1);
      END IF;
      IF to_number(substr(l_left_str, 1, 1)) = 0 OR l_left_length IS NULL THEN
        l_vt := l_vt || '零';
      END IF;
      l_speech := l_speech || l_vt;
    ELSE
      RETURN '数量过大,不允许数量过亿';
    END IF;
  END IF;
  l_vt := NULL;
  IF length(l_right_str) >= 1 THEN
    l_vt := '点';
    i    := 1;
    WHILE i <= length(l_right_str) LOOP
      l_vn := to_number(substr(l_right_str, i, 1));
      IF l_vn = 0 THEN
        l_vt := l_vt || '零';
      ELSE
        l_vt := l_vt || substr(l_number_str, l_vn, 1);
      END IF;
      i := i + 1;
    END LOOP;
  END IF;
  l_speech := l_speech || l_vt;
  RETURN l_speech;
END;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值