Untitled
user_4058768
plain_text
a month ago
2.4 kB
3
Indexable
create FUNCTION NUMBER_TO_WORDS (num IN NUMBER) RETURN VARCHAR2 IS TYPE t_words IS TABLE OF VARCHAR2(20) INDEX BY PLS_INTEGER; v_units t_words; v_tens t_words; v_result VARCHAR2(4000); v_num VARCHAR2(50) := TO_CHAR(num, '9999999990D0'); -- Định dạng với 1 chữ số thập phân v_int_part VARCHAR2(50); v_dec_part VARCHAR2(50); BEGIN v_units(0) := 'không'; v_units(1) := 'một'; v_units(2) := 'hai'; v_units(3) := 'ba'; v_units(4) := 'bốn'; v_units(5) := 'năm'; v_units(6) := 'sáu'; v_units(7) := 'bảy'; v_units(8) := 'tám'; v_units(9) := 'chín'; v_tens(10) := 'mười'; v_tens(20) := 'hai mươi'; v_tens(30) := 'ba mươi'; v_tens(40) := 'bốn mươi'; v_tens(50) := 'năm mươi'; v_tens(60) := 'sáu mươi'; v_tens(70) := 'bảy mươi'; v_tens(80) := 'tám mươi'; v_tens(90) := 'chín mươi'; -- Tách phần nguyên và phần thập phân IF INSTR(v_num, '.') > 0 THEN v_int_part := SUBSTR(v_num, 1, INSTR(v_num, '.') - 1); v_dec_part := SUBSTR(v_num, INSTR(v_num, '.') + 1); -- Nếu phần thập phân là '0', đảm bảo chuyển đổi thành 'không' IF v_dec_part = '0' THEN v_dec_part := '0'; END IF; ELSE v_int_part := v_num; v_dec_part := NULL; END IF; -- Chuyển đổi phần nguyên IF v_int_part IS NOT NULL THEN IF TO_NUMBER(v_int_part) < 10 THEN v_result := v_units(TO_NUMBER(v_int_part)); ELSIF TO_NUMBER(v_int_part) < 100 THEN v_result := v_tens(TRUNC(TO_NUMBER(v_int_part) / 10) * 10); IF MOD(TO_NUMBER(v_int_part), 10) > 0 THEN v_result := v_result || ' ' || v_units(MOD(TO_NUMBER(v_int_part), 10)); END IF; ELSE v_result := 'số quá lớn'; END IF; ELSE v_result := ''; END IF; -- Chuyển đổi phần thập phân nếu có IF v_dec_part IS NOT NULL AND LENGTH(v_dec_part) > 0 THEN v_result := v_result || ' chấm'; FOR i IN 1..LENGTH(v_dec_part) LOOP v_result := v_result || ' ' || v_units(TO_NUMBER(SUBSTR(v_dec_part, i, 1))); END LOOP; ELSE v_result := ''; END IF; RETURN v_result; END; /
Editor is loading...
Leave a Comment