SQL语句 - 数字转英文

用途

将数字转为对应的英文单词,技术写代码可引用这一段

使用场景

发票、对账单等处输出金额

语句

/*  FUNCTION money_format_us(p_money_amount IN NUMBER) RETURN VARCHAR2 IS*/
DECLARE
  p_money_amount NUMBER := -2.04;
  TYPE lt_array_type IS VARRAY(50) OF VARCHAR2(20);
   /*一维数组,字符串类型 */
  l_array        lt_array_type := lt_array_type('ONE ',
                                                'TWO ',
                                                'THREE ',
                                                'FOUR ',
                                                'FIVE ',
                                                'SIX ',
                                                'SEVEN ',
                                                'EIGHT ',
                                                'NINE ',
                                                'TEN ',
                                                'ELEVEN ',
                                                'TWELVE ',
                                                'THIRTEEN ',
                                                'FOURTEEN ',
                                                'FIFTEEN ',
                                                'SIXTEEN ',
                                                'SEVENTEEN ',
                                                'EIGHTEEN ',
                                                'NINETEEN ',
                                                'TWENTY ',
                                                'THIRTY ',
                                                'FORTY ',
                                                'FIFTY ',
                                                'SIXTY ',
                                                'SEVENTY ',
                                                'EIGHTY ',
                                                'NINETY ',
                                                'HUNDRED ',
                                                'THOUSAND ',
                                                'MILLION ',
                                                'BILLION ');
  c_money_amount VARCHAR2(14);
  l_string       VARCHAR2(600);
  n              CHAR;
  l_pre_n        CHAR;
  l_length       NUMBER;
  i              NUMBER;
  tmp            NUMBER;
  l_decimal_flag VARCHAR2(1);
  l_money_amount NUMBER;
  l_sign         VARCHAR2(10);
BEGIN
  l_money_amount := round(abs(p_money_amount), 2);
  IF p_money_amount < 0 THEN
    l_sign := 'NEGATIVE ';
  ELSE
    l_sign := '';
  END IF;
  tmp            := l_money_amount * 100;
  c_money_amount := rtrim(ltrim(to_char(tmp, '999999999999999999')));
  l_length       := length(c_money_amount);
  i              := 0;
  WHILE i < l_length - 2 LOOP
    i := i + 1;
    IF MOD(l_length - 2 - i, 3) = 2 THEN
      n := substr(c_money_amount, i, 1);
      IF n <> '0' THEN
        l_string := l_string || l_array(to_number(n));
        l_string := l_string || l_array(to_number(28));
      END IF;
    END IF;
    IF MOD(l_length - 2 - i, 3) = 1 THEN
      n := substr(c_money_amount, i, 1);
      IF n = '1' THEN
        l_pre_n := n;
      END IF;
      IF n NOT IN ('0', '1') THEN
        l_string := l_string || l_array(to_number(n) + 18);
      END IF;
    END IF;
    IF MOD(l_length - 2 - i, 3) = 0 THEN
      IF nvl(l_pre_n, 'X') = '1' THEN
        n        := substr(c_money_amount, i, 1);
        l_string := l_string || l_array(to_number(l_pre_n || n));
        l_pre_n  := NULL;
      ELSE
        n := substr(c_money_amount, i, 1);
        IF n <> '0' THEN
          l_string := l_string || l_array(to_number(n));
        END IF;
      END IF;
    END IF;
    IF l_length - i = 5 AND substr(c_money_amount, i - 2, 3) <> '000' THEN
      l_string := l_string || l_array(to_number(29));
    END IF;
    IF l_length - i = 8 AND substr(c_money_amount, i - 2, 3) <> '000' THEN
      l_string := l_string || l_array(to_number(30));
    END IF;
    IF l_length - i = 11 THEN
      l_string := l_string || l_array(to_number(31));
    END IF;
  END LOOP;
  n := substr(c_money_amount, l_length - 1, 1);
  IF n NOT IN ('0', '1') THEN
    l_decimal_flag := 'Y';
    l_string       := l_string || 'AND ';
    l_string       := l_string || l_array(to_number(n) + 18);
  END IF;
  IF n = '1' THEN
    l_decimal_flag := 'Y';
    l_string       := l_string || 'AND ';
    l_pre_n        := n;
    n              := substr(c_money_amount, l_length, 1);
    l_string       := l_string || l_array(to_number(l_pre_n || n));
  ELSE
    n := substr(c_money_amount, l_length, 1);
    IF n <> '0' THEN
      IF nvl(l_decimal_flag, 'N') = 'N' THEN
        l_string := l_string || 'AND ';
      END IF;
      l_decimal_flag := 'Y';
      l_string       := l_string || l_array(to_number(n));
    END IF;
  END IF;
  IF l_decimal_flag = 'Y' THEN
    l_string := l_string || 'CENTS ';
  ELSE
    l_string := l_string;
  END IF;
  l_string := l_sign || l_string; /*RETURN l_string;*/
  dbms_output.put_line(l_string); /* EXCEPTION  WHEN OTHERS THEN    RETURN(SQLERRM);*/
END;



本文标题:SQL语句 - 数字转英文

本文链接:https://catonisland.cn/post/138.html

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章