题目:将1234567890按照千分位分割,结果为"1,234,567,890.00"形式(这里保留了二位小数,按题目实际要求处理)php
分析:添加千分位分割符是从个位往高位数的,所以要考虑从后往前处理字符串。面试
方法一:调用php函数处理。直接使用php的函数,但面试要求实现的应该是不让使用系统函数的数组
$res = number_format($num);
方法2、按照数字从后面数过来,每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的倍数,不是的话分为左右两部分code
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位拼接","orm
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; }