– **********************************************
– FUNCTION NAME:
– CONVERT_MONEY
– DESCRIPTION:
– 将“阿拉伯数字”转换成“大写汉字”
– **********************************************
FUNCTION convert_money(input_nbr IN NUMBER DEFAULT 0) RETURN VARCHAR2 IS
--
num_character VARCHAR2(100) := '零壹贰叁肆伍陆柒捌玖';
unit_character VARCHAR2(300) := '分角圆拾佰仟万拾佰仟亿拾佰仟万拾佰仟亿';
output_string VARCHAR2(500) := '';
remain_nbr NUMBER(20);
input_nbr_bak NUMBER(30); -- 用于接收输入参数 INPUT_NBR
bit_num NUMBER(20); -- 每一位上的数字
bit_unit VARCHAR2(20); -- 每一位所对的单位
bit_indic NUMBER(3) := 0; -- 每一位的数字是否为0,0表示为0,1表示不为0
i NUMBER(2) := 0; -- 循环次数,索引变量从0开始
spe_unit VARCHAR2(30) := 'A'; -- 特殊位,包括万和亿,表示该亿汉字是否已写入结果字串
sign_indic VARCHAR2(1); -- 用于标志数值符号:0为正,1为负
--
BEGIN
--
IF input_nbr = 0 THEN
RETURN '零圆整';
ELSIF input_nbr > 0 THEN
sign_indic := '0';
input_nbr_bak := input_nbr;
ELSIF input_nbr < 0 THEN
sign_indic := '1';
input_nbr_bak := -input_nbr;
END IF;
--
LOOP
--
remain_nbr := floor(input_nbr_bak / 10); -- 取出除后的商
bit_num := input_nbr_bak - remain_nbr * 10; -- 取出当前位的数值
input_nbr_bak := remain_nbr; -- 保存商以做下一次循环
bit_unit := rtrim(substr(unit_character, i * 1 + 1, 1)); -- 取出当前位的单位汉字
--
IF bit_num > 0 THEN
--
bit_indic := 1;
--
IF i = 6 OR i = 14 THEN
spe_unit := '万';
ELSIF (i >= 7 AND i <= 9) OR (i >= 15 AND i <= 17) THEN
--
IF spe_unit != '万' THEN
output_string := '万' || output_string;
spe_unit := '万';
END IF;
--
END IF;
--
output_string := substr(num_character, bit_num * 1 + 1, 1) ||
bit_unit || output_string;
--
ELSE
--
IF bit_indic = 1 THEN
output_string := '零' || output_string;
END IF;
--
IF bit_unit IN ('圆', '亿') THEN
spe_unit := bit_unit;
output_string := bit_unit || output_string;
END IF;
--
bit_indic := 0;
--
END IF;
--
i := i + 1;
--
EXIT WHEN input_nbr_bak = 0;
--
END LOOP;
--
-- ****************************
-- 输入的数字没有分,最小的是角,则尾部串个整
-- ****************************
IF MOD(input_nbr, 10) = 0 THEN
output_string := output_string || '整';
END IF;
--
IF sign_indic = '1' THEN
output_string := '负' || output_string;
END IF;
--
RETURN output_string;
--
END convert_money;