|
最初由 cooler 发布
[B]SQL> SELECT TO_CHAR ( TO_DATE ( TO_CHAR ( 1783, '99999999999') , 'J'), 'JSP') FROM dual;
TO_CHAR(TO_DATE(TO_CHAR(1783,'
------------------------------------------------------------------------------
ONE THOUSAND SEVEN HUNDRED EIGHTY-THREE
SQL> [/B]

但有局限性,超过百万的数字不行吧
CREATE OR REPLACE FUNCTION convert_capital_money (
p_money NUMBER
)
RETURN VARCHAR2
IS
TYPE dime IS TABLE OF VARCHAR2 (20)
INDEX BY BINARY_INTEGER;
numberstr dime;
degratstr dime;
convertm dime;
tmpstr VARCHAR2 (200);
t_money_int VARCHAR2 (10);
i INT;
len_t_money_int INT;
t_money_dec VARCHAR2 (2);
r_value VARCHAR2 (1000) := '';
num NUMBER;
BEGIN
numberstr (1) := 'zero';
numberstr (2) := 'one';
numberstr (3) := 'two';
numberstr (4) := 'three';
numberstr (5) := 'four';
numberstr (6) := 'five';
numberstr (7) := 'six';
numberstr (8) := 'seven';
numberstr (9) := 'eight';
numberstr (10) := 'nine';
numberstr (11) := 'ten';
numberstr (12) := 'eleven';
numberstr (13) := 'twelve';
numberstr (14) := 'thirteen';
numberstr (15) := 'fourteen';
numberstr (16) := 'fifteen';
numberstr (17) := 'sixteen';
numberstr (18) := 'seventeen';
numberstr (19) := 'eighteen';
numberstr (20) := 'nineteen';
numberstr (21) := '';
numberstr (22) := '';
numberstr (23) := 'twenty';
numberstr (24) := 'thirty';
numberstr (25) := 'forty';
numberstr (26) := 'fifty';
numberstr (27) := 'sixty';
numberstr (28) := 'seventy';
numberstr (29) := 'eighty';
numberstr (30) := 'ninety';
degratstr (1) := 'thousand';
degratstr (2) := 'million';
degratstr (3) := 'billion';
degratstr (4) := 'trillion';
num := p_money;
IF num = 0
THEN
r_value := 'ZERO';
END IF;
t_money_int := TRIM (TO_CHAR (num, '9999999999'));
t_money_dec :=
SUBSTR (TRIM (TO_CHAR (num, '9999999999.99')),
LENGTH (t_money_int) + 2,
2
);
SELECT DECODE (MOD (LENGTH (t_money_int), 3),
1, '00' || t_money_int,
2, '0' || t_money_int,
t_money_int
)
INTO t_money_int
FROM DUAL;
len_t_money_int := LENGTH (t_money_int);
i := 0;
WHILE i < len_t_money_int
LOOP
i := i + 3;
convertm (1) := SUBSTR (t_money_int, len_t_money_int - i + 1, 1);
convertm (2) := SUBSTR (t_money_int, len_t_money_int - i + 2, 1);
convertm (3) := SUBSTR (t_money_int, len_t_money_int - i + 3, 1);
tmpstr := '';
IF convertm (1) <> '0'
THEN
tmpstr :=
TRIM ( tmpstr
|| ' '
|| numberstr (TO_NUMBER (convertm (1)) + 1)
|| ' hundred'
);
END IF;
IF convertm (2) = '1'
THEN
tmpstr :=
TRIM (tmpstr || ' ' || numberstr (TO_NUMBER (convertm (3)) + 11));
ELSE
IF convertm (2) <> '0'
THEN
IF convertm (3) = '0'
THEN
tmpstr :=
TRIM ( tmpstr
|| ' '
|| numberstr (TO_NUMBER (convertm (2)) + 21)
);
ELSE
tmpstr :=
TRIM ( tmpstr
|| ' '
|| numberstr (TO_NUMBER (convertm (2)) + 21)
|| '-'
|| numberstr (TO_NUMBER (convertm (3)) + 1)
);
END IF;
ELSE
IF convertm (3) <> '0'
THEN
tmpstr :=
TRIM (tmpstr || ' '
|| numberstr (TO_NUMBER (convertm (3)) + 1)
);
END IF;
END IF;
END IF;
IF i = 3
THEN
r_value := TRIM (tmpstr || ' ' || r_value);
ELSE
r_value :=
TRIM (tmpstr || ' ' || degratstr (i / 3 - 1) || ' ' || r_value);
END IF;
END LOOP;
tmpstr := '';
IF TO_NUMBER (t_money_dec) > 0
THEN
IF SUBSTR (t_money_dec, 1, 1) = '0'
THEN
tmpstr := 'and ' || SUBSTR (t_money_dec, 2, 1) || '/100';
ELSE
tmpstr := 'and ' || t_money_dec || '/100';
END IF;
r_value := UPPER (r_value || ' ' || tmpstr || ' only.');
ELSE
r_value := UPPER (r_value || ' only.');
END IF;
RETURN p_currency || ' ' || r_value;
END;
/ |
|