oracle 百分比格式转换/千分位格式化数据

来源:互联网 发布:鼠标测试软件绿色版 编辑:程序博客网 时间:2024/06/05 10:26

--创建包头

CREATE OR REPLACE PACKAGE  system.pk_pub IS
   FUNCTION fn_fmt_percent
    (
        i_value IN NUMBER, --需要格式化的数值
        i_len   IN NUMBER DEFAULT 2 --要保留的小数位数
    ) RETURN VARCHAR2;
   
   FUNCTION fn_fmt_percent
    (
        i_value IN VARCHAR2, --需要格式化的数值
        i_len   IN NUMBER DEFAULT 2 --要保留的小数位数
    ) RETURN VARCHAR2 ;
   
   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;

end pk_pub;


--创建包体

CREATE OR REPLACE PACKAGE BODY system.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;


转载:http://blog.csdn.net/feimashenhua/article/details/6203141