php实现中文转数字
分享一个辅助函数,使用php尽可能识别出字符串中的数字,
先上代码
functioncheckNatInt($str){
$map=array(
'一'=>'1','二'=>'2','三'=>'3','四'=>'4','五'=>'5','六'=>'6','七'=>'7','八'=>'8','九'=>'9',
'壹'=>'1','贰'=>'2','叁'=>'3','肆'=>'4','伍'=>'5','陆'=>'6','柒'=>'7','捌'=>'8','玖'=>'9',
'零'=>'0','两'=>'2',
'仟'=>'千','佰'=>'百','拾'=>'十',
'万万'=>'亿',
);
$str=str_replace(array_keys($map),array_values($map),$str);
$str=checkString($str,'/([\d亿万千百十]+)/u');
$func_c2i=function($str,$plus=false)use(&$func_c2i){
if(false===$plus){
$plus=array('亿'=>100000000,'万'=>10000,'千'=>1000,'百'=>100,'十'=>10,);
}
$i=0;
if($plus)
foreach($plusas$k=>$v){
$i++;
if(strpos($str,$k)!==false){
$ex=explode($k,$str,2);
$new_plus=array_slice($plus,$i,null,true);
$l=$func_c2i($ex[0],$new_plus);
$r=$func_c2i($ex[1],$new_plus);
if($l==0)$l=1;
return$l*$v+$r;
}
}
return(int)$str;
}
return$func_c2i($str);
}
//来自uctphp微信开发框架,其中的checkString函数如下
functioncheckString($var,$check='',$default=''){
if(!is_string($var)){
if(is_numeric($var)){
$var=(string)$var;
}
else{
return$default;
}
}
if($check){
return(preg_match($check,$var,$ret)?$ret[1]:$default);
}
return$var;
}
实现效果如下。
echocheckNatInt('九百六十万');//普通中文数字,9600000
echocheckNatInt('壹亿柒仟万零捌佰肆拾');//大写中文数字,170000840
echocheckNatInt('学好PHP拿百万年薪');//句子中的数字,1000000
echocheckNatInt('今年春运发送人次达26亿');//数字和汉字混合出现,2600000000
echocheckNatInt('两只小蜜蜂');//口语化数字,2
echocheckNatInt('万万没想到');//复古的表达方式,100000000
注意事项
不支持小数
不支持大于PHP_INT_MAX的数