Untitled
user_4058768
plain_text
9 months ago
2.4 kB
6
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