Untitled

 avatar
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