php的函数很丰富也很强大,其中就有一个number_format()可以格式化数字的
思路2:上面那种办法虽然可以实现,但是感觉很麻烦,那么我们有没有其他办法呢,我们可以拓展一下思路,既然,是按照数字从后面数过来,每3位添加一个',',那么,如果,我们把数字反转过来,然后再分割,不就可以直接添加','然后再反转过去,是不是就不需要再讨论是不是3的倍数了呢,具体代码如下
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;
}
其实实现一个目的的话,可以有很多种方法,但是这些方法的效率和代码量都不一定相同,在项目中,我们肯定是使用那些好理解和代码量少的,但是面试的时候多准备几个总是没错的