题目:将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;
}