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

--创建包头

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值