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;
oracle转换数字格式,oracle 百分比格式转换/千分位格式化数据
最新推荐文章于 2023-05-16 11:48:45 发布