CREATE OR REPLACE PACKAGE BODY pk_pub IS
---------------------------------------------------------------------------------------
-- 英文名称: fmt_percent
-- 模块功能: 百分比格式转换
-- 备 注: 1、将数值型变量格式化为百分比形式并保留规定位数的小数,形如'99.99%'
---------------------------------------------------------------------------------------
FUNCTION fn_fmt_percent
(
i_value IN NUMBER, --需要格式化的数值
i_len IN NUMBER DEFAULT 2 --要保留的小数位数
) RETURN VARCHAR2 IS
v_num NUMBER;
v_rvalue VARCHAR2(100);
BEGIN
v_num := nvl(i_value, 0);
v_rvalue := round(v_num * 100, i_len) || '%';
IF substr(v_rvalue, 1, 1) = '.' THEN
v_rvalue := '0' || v_rvalue;
ELSIF substr(v_rvalue, 1, 2) = '-.' THEN
v_rvalue := '-0' || substr(v_rvalue, 2);
END IF;
RETURN v_rvalue;
END fn_fmt_percent;
/*
*重载
*/
FUNCTION fn_fmt_percent
(
i_value IN VARCHAR2, --需要格式化的数值
i_len IN NUMBER DEFAULT 2 --要保留的小数位数
) RETURN VARCHAR2 IS
v_num NUMBER;
v_rvalue VARCHAR2(100);
BEGIN
IF i_value = '-' THEN
RETURN '-';
ELSIF i_value IS NULL THEN
RETURN '0%';
ELSE
v_num := nvl(to_number(i_value), 0);
END IF;
v_rvalue := round(v_num * 100, i_len) || '%';
IF substr(v_rvalue, 1, 1) = '.' THEN
v_rvalue := '0' || v_rvalue;
ELSIF substr(v_rvalue, 1, 2) = '-.' THEN
v_rvalue := '-0' || substr(v_rvalue, 2);
END IF;
RETURN v_rvalue;
END fn_fmt_percent;
---------------------------------------------------------------------------------------
-- 英文名称: fmt_number
-- 模块功能: 按保留小数位数、千分位、显示单位(亿元、万元)格式化数据
-- 备 注: 1、将数值型变量格式化为带千分位并保留规定位数的小数, 形如'9,999,999.99'
---------------------------------------------------------------------------------------
FUNCTION fn_fmt_number
(
i_value IN NUMBER, --需要格式化的数值
i_len IN NUMBER DEFAULT 2, --要保留的小数位数
i_unit IN NUMBER DEFAULT 0 --显示的单位,万元为10,000;百万为1,000,000,依次类推
) RETURN VARCHAR2 IS
v_num NUMBER;
v_numi VARCHAR2(100);
v_numd VARCHAR2(100);
v_len NUMBER;
v_unit NUMBER;
v_dot NUMBER;
BEGIN
v_num := nvl(i_value, 0);
v_len := i_len;
v_unit := i_unit;
--然后四舍五入
IF v_unit = 0 THEN
v_num := round(v_num, v_len);
ELSE
v_num := round(v_num / v_unit, v_len);
END IF;
--判断是否包含小数部分
v_dot := instr(v_num, '.');
IF v_dot = 0 THEN
v_dot := lengthb(v_num) + 1;
END IF;
IF abs(v_num) >= 1 THEN
--取得整数部分,然后格式化成999,999,999,999,
v_numi := to_char(substr(v_num, 1, v_dot),
'9,999,999,999,999,999,999');
ELSIF v_num < 0 THEN
v_numi := '-0';
ELSE
v_numi := '0';
END IF;
--取得小数部分
v_numd := to_char(substr(v_num, v_dot));
--整数和小数部分拼接
RETURN nvl(TRIM(v_numi || v_numd), 0);
EXCEPTION
WHEN OTHERS THEN
RETURN '';
END fn_fmt_number;
END pk_pub;