php技术博客

记录php相关学习知识及开发示例、疑难问题等

php面试题之按照指定数量从尾部开始分割字符串

这个面试题要求从尾部开始安装指定位数分割字符串,如“1234567”,按3位长度分割,转换为“1,234,567”。对php函数比较熟悉的,知道可以用 number_format('1234567') 来生产结果。但是我们要知道 number_format只能对数值型字符串进行处理,并且只能按照3位长度分割。如何使用通用的解决方案了。下面是用两种方法来实现上面的方法

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,然后用第一个函数即可

示例源码打包下载地址: 字符串按指定位数从尾部开始进行分割.zip