写了一个,只能是算出两位数以下的, 帮我看看能不能优化一下
function cn2num1($cn){
switch($cn){
case "一":
return 1;
break;
case "二":
return 2;
break;
case "三":
return 3;
break;
case "四":
return 4;
break;
case "五":
return 5;
break;
case "六":
return 6;
break;
case "七":
return 7;
break;
case "八":
return 8;
break;
case "九":
return 9;
break;
case "十":
return 10;
break;
}
}
function cn2num2($num){
    $mynum=split("十",$num);
return cn2num1($mynum[0]).(cn2num1($mynum[1])?cn2num1($mynum[1]):0);
}
function cn2num($num){
if (strlen($num)==2) return cn2num1($num);
if (strlen($num)>2) return cn2num2($num);
}
?>

解决方案 »

  1.   

    糊里糊涂的写了一个,只支持万亿以下。暂时想不到什么好思路。
    没有仔细调试的:
    function qian($str)//千以下
    {
    $arrDig=array('零','一','二','三','四','五','六','七','八','九');
    $arrP=array('亿','万','千','百','十');
    if(strlen($str)==2) return array_search($str,$arrDig);
    //千
    if($qianPos=strpos($str,'千')){
    $r=array_search(substr($str,$qianPos-2,2),$arrDig)*1000;
    }
    //百
    if($baiPos=strpos($str,'百')){
    $r+=array_search(substr($str,$baiPos-2,2),$arrDig)*100;
    }
    //十
    if(($shiPos=strpos($str,''))!==false){
    if($shiPos>1) 
    $r+=array_search(substr($str,$shiPos-2,2),$arrDig)*10;
    else 
    $r+=10;
    }
    if(!in_array($gePos=substr($str,-2),$arrP))
    $r+=array_search($gePos,$arrDig);
    return $r;
    }
    function cnToNum($str)//千亿以下
    {
    //亿
    if($yiPos=strpos($str,'亿')){
    $r=qian(substr($str,0,$yiPos))*100000000;
    }
    //万
    if($wanPos=strpos($str,'万')){
    if($yiPos) $start1=$yiPos+2;
    else $start1=0;
    $r+=qian(substr($str,$start1,$wanPos-$start1))*10000;
    } //万以下
    if($r){
    $r+=qian(substr($str,max($wanPos,$yiPos)+2));
    }else{
    $r=qian($str);
    }
    return $r;
    }
    $str="二百亿零四千五百二十万六千五百二十一";
    echo $str.'=>'.cnToNum($str);
      

  2.   

    //十
    if(($shiPos=strpos($str,''))!==false){这里掉了一个'十'://十
    if(($shiPos=strpos($str,'十'))!==false){