面试:将数据按照千分位分割的5种方法

题目:将1234567890按照千分位分割,结果为"1,234,567,890.00"形式(这里保留了二位小数,按题目实际要求处理)

分析:添加千分位分割符是从个位往高位数的,因此要考虑从后往前处理字符串。

方法一:调用php函数处理。直接使用php的函数,但面试要求实现的应该是不让使用系统函数的

$res = number_format($num);

方法二、按照数字从后面数过来,每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的倍数和不是3的倍数,不是的话分为左右两部分

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); //先求模,这个摸就是左边长度
        $temp = str_split(substr($leftStr,$left),3);

        //然后把left部分放压入数组最前面
        array_unshift($temp,$left);
        return implode(",",$temp) . '.' . $rigthStr;
    }
}  

方法四:按照从后往前的顺序,倒叙依次截取字符串,每到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;
}

方法五:将字符串当做数组倒叙来取,然后依次拼接

function toNum3($str){
    $str = sprintf('%.2f',$str);
    $strArr = explode('.',$str);
    $leftStr = $strArr[0];
    $rigthStr = $strArr[1];
    $len = strlen($leftStr);
 
    $temp = '';
    for($i=$len-1,$j=1;$i>=0;$i--,$j++) {
            if($j%3==0) {
                $temp = ",".$str[$i].$temp;
            }else{
                $temp = $str[$i].$temp;
            }
    }
    return $temp . '.' . $rigthStr;
}

你可能感兴趣的:(php)