公司的需求里有一个小地方要将阿拉伯数字转成中文,这里把我实现的代码分享出来,希望能够帮助其他需要的人,或者给一些启发。应该支持任意大的数字。
/**
* 数字转中文
*
* @param int $num
* @return string
*/
function num_to_chinese(int $num){
$chunk=function(array $nums,int $size):array{
$len=count($nums);
$head=$len%$size;
$chunk=[];
$subSize=floor($len/$size);
if($head){
$chunk[$subSize]=array_slice($nums,0,$head);
}
for($i=0;$i<$subSize;$i++){
$chunk[$subSize-$i-1]=array_slice($nums,$head+$i*$size,$size);
}
return $chunk;
};
$chiLoop=['','万','亿'];
$loopApply=function(int $loop,array $chiLoop):string{
$chiLoopSize=count($chiLoop)-1;
$res=[];
for($i=$chiLoopSize;$i>0;$i--){
$res[]=str_repeat($chiLoop[$i],floor($loop/$i));
$loop=$loop%$i;
if(!$loop){
break;
}
}
return implode('',array_reverse($res));
};
$chiNum = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
$chiUni = ['','十', '百','千'];
$looper=function($num,$suffix)use($chiNum,$chiUni){
$len=count($num);
$res=[];
foreach ($num as $key=>$value){
$value=(int)$value;
if($value){
$zero='';
if($key && !$num[$key-1]){
$zero=$chiNum[0];
}
$res[]=$zero.$chiNum[$value].$chiUni[$len-$key-1];
}
}
$res[]=$suffix;
if($suffix && end($num)==='0'){
$res[]=$chiNum[0];
}
return implode('',$res);
};
if(!$num){
return $chiNum[0];
}
$numArr=str_split($num);
$numChunk=$chunk($numArr,4);
$res='';
foreach ($numChunk as $loop=>$chunk){
$res.=$looper($chunk,$loopApply($loop,$chiLoop));
}
if(mb_substr($res,0,2,'utf8')==='一十'){
return mb_substr($res,1,null,'utf8');
}
return $res;
}