不使用number_format()函数格式化数字

php的函数很丰富也很强大,其中就有一个number_format()可以格式化数字的

echo number_format("1000000");                  //1,000,000 
echo number_format("1000000",2);                //1,000,000.00
echo number_format("1000000",2,",",".");        //1.000.000,00 
但是很多面试的时候都需要我们自己写一个类似这样的格式化函数,我们就写一个把所有数字格式化为两位小数的一个格式化函数 
        我们首先把这个数字分开小数和整数部分,小数部分很好处理,但是整数部分要怎么处理呢,我们可以观察这种格式,其实就是从整数部分后面数上来,每三位添加一个','就可以了(最前面或者不够三位不不添加)。         思路1:我们可以分两种情况考虑,情况1:整数部分为3的倍数,这就很简单了,我们只要把它按每三位分割,组成一个数组,然后用implode函数用','合并就可以了,但是如果不是三的倍数那要怎么处理呢,我们让他成为三的倍数,怎么说呢,我们把这个整数部分分为左右两边,右边部分是最接近这个数字长度的3的倍数,然后剩下的部分为左边部分,拼起来就是这个数字了,右边部分我们使用前面的方法,按三位分割,放到一个数组里面,然后在把左边部分放到这个数组的最前面,再用implode来拼接,最后就可以得到格式化部分,具体代码如下
function toNum1($str){
    $str = sprintf('%.2f',$str);  //把数字格式化为2位小数
    $strArr = explode('.',$str);
    $leftStr = $strArr[0];
    $rigthStr = $strArr[1];
    $len = strlen($leftStr);
    if($len%3 == 0){
        //为3的倍数,直接截取
        $temp = str_split($leftStr,3);
        return implode($temp,',') . '.' . $rigthStr;
    }else{
        //不是3的倍数,计算右边为3倍数的部分
        $left = substr($str,0,$len%3); //先求模,这个摸就是左边长度
        $ringthlen = $len - $len%3;
        $temp = str_split(substr($leftStr,-$ringthlen),3);
        //然后把left部分放压入数组最前面
        array_unshift($temp,$left);
        return implode($temp,',') . '.' . $rigthStr;
    }   
}

      思路2:上面那种办法虽然可以实现,但是感觉很麻烦,那么我们有没有其他办法呢,我们可以拓展一下思路,既然,是按照数字从后面数过来,每3位添加一个',',那么,如果,我们把数字反转过来,然后再分割,不就可以直接添加','然后再反转过去,是不是就不需要再讨论是不是3的倍数了呢,具体代码如下
function toNum2($str){
    $str = sprintf('%.2f',$str);
    $strArr = explode('.',$str);
    $leftStr = $strArr[0];
    $rigthStr = $strArr[1];
    $temp = implode(',',str_split(strrev($leftStr),3));
    return strrev($temp) . '.' . $rigthStr;
}
思路3:假如我们不使用反转函数,我们要怎么来实现这个呢。我们可以这样想,既然我们是需要从后面上来三位一添加,我们可不可以写一个for循环来截取这个数字,从后面开始截取,每3位添加一个','不就可以了么,具体代码如下
function toNum3($str){
    $str = sprintf('%.2f',$str);
    $strArr = explode('.',$str);
    $leftStr = $strArr[0];
    $rigthStr = $strArr[1];
    $len = strlen($leftStr);
    $temp = '';
    for($i=1;$i<=$len;$i++){
        if($i%3 == 0 && ($i != $len)){//这里要判断,不能是数字最前面那个避免在前面多加','
            $temp = ',' . substr($leftStr,-$i,1)  . $temp;
        }else{
            $temp = substr($leftStr,-$i,1) . $temp;
        }
    }
    return $temp . '.' . $rigthStr;
}
其实实现一个目的的话,可以有很多种方法,但是这些方法的效率和代码量都不一定相同,在项目中,我们肯定是使用那些好理解和代码量少的,但是面试的时候多准备几个总是没错的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值