这个面试题要求从尾部开始安装指定位数分割字符串,如“1234567”,按3位长度分割,转换为“1,234,567”。对php函数比较熟悉的,知道可以用 number_format('1234567') 来生产结果。但是我们要知道 number_format只能对数值型字符串进行处理,并且只能按照3位长度分割。如何使用通用的解决方案了。下面是用两种方法来实现上面的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | function str_format1( $str , $sep_number =3, $sep = ',' ){ if ( $sep_number < 1) $sep_number =3; $len = strlen ( $str ); $remain = $len % $sep_number ; if ( $remain ==0) $remain = $sep_number ; $count = ceil ( $len / $sep_number ); $res = '' ; for ( $i =0; $i < $count ; $i ++){ if ( $i ==0){ $start =0; } else { $start = $remain + ( $i -1)* $sep_number ; } $length = $i ==0 ? $remain : $sep_number ; $res .=( $res ? $sep : '' ). substr ( $str , $start , $length ); } return $res ; } function str_format2( $str , $sep_number =3, $sep = ',' ){ if ( $sep_number < 1) $sep_number =3; $len = strlen ( $str ); $count = ceil ( $len / $sep_number ); $str = strrev ( $str ); $res = '' ; for ( $i =0; $i < $count ; $i ++){ $start = $i * $sep_number ; $res = strrev ( substr ( $str , $start , $sep_number )).( $res ? $sep . $res : '' ); } return $res ; } $str = '' ; var_dump(str_format2( '1234567' )); //"1,234,567" var_dump(str_format2( 'abc2defg' ,4)); //"abc,defg" |
str_format2函数里面用到 strrev函数,帮字符串颠倒过来。这里没有考虑有汉字的情况,如果有需要,帮其中strlen换成mb_strlen、substr换成mb_substr,然后用第一个函数即可
友情提示:垃圾评论一律封号...