+ -
当前位置:首页 → 问答吧 → 阿拉伯数字转汉字

阿拉伯数字转汉字

时间:2006-12-28

来源:互联网

感觉这个方法有点笨,好像还有错误,暂时没发现
复制PHP内容到剪贴板
PHP代码:

<?php
$basical=array("零","一","二","三","四","五","六","七","八","九");   
//$basical=array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖");   
$advanced=array("十","百","千");
//$advanced=array("拾","佰","仟"); 
$top = array("","万","亿","万亿");   
function levelfor($array){
    global $basical,$advanced;
    if($array[0]==0&&$array[1]==0&&$array[2]==0&&$array[3]!=0){
        $result=$basical[0].$basical[$array[3]];
    }elseif($array[0]==0&&$array[1]==0&&$array[2]!=0&&$array[3]==0){
        $result=$basical[0].$basical[$array[2]].$advanced[0];
    }elseif($array[0]==0&&$array[1]!=0&&$array[2]==0&&$array[3]==0){
        $result=$basical[0].$basical[$array[1]].$advanced[1];
    }elseif($array[0]!=0&&$array[1]==0&&$array[2]==0&&$array[3]==0){
        $result=$basical[$array[0]].$advanced[2];
    }elseif($array[0]!=0&&$array[1]!=0&&$array[2]==0&&$array[3]==0){
        $result=$basical[$array[0]].$advanced[2].$basical[$array[1]].$advanced[1];
    }elseif($array[0]!=0&&$array[1]==0&&$array[2]!=0&&$array[3]==0){
        $result=$basical[$array[0]].$advanced[2].$basical[0].$basical[$array[2]].$advanced[0];
    }elseif($array[0]!=0&&$array[1]==0&&$array[2]==0&&$array[3]!=0){
        $result=$basical[$array[0]].$advanced[2].$basical[0].$basical[$array[3]];
    }elseif($array[0]==0&&$array[1]!=0&&$array[2]==0&&$array[3]!=0){
        $result=$basical[0].$basical[$array[1]].$advanced[1].$basical[0].$basical[$array[3]];
    }elseif($array[0]==0&&$array[1]==0&&$array[2]!=0&&$array[3]!=0){
        $result=$basical[0].$basical[$array[2]].$advanced[0].$basical[$array[3]];
    }elseif($array[0]==0&&$array[1]!=0&&$array[2]!=0&&$array[3]==0){
        $result=$basical[0].$basical[$array[1]].$advanced[1].$basical[$array[2]].$advanced[0];
    }elseif($array[0]!=0&&$array[1]!=0&&$array[2]!=0&&$array[3]==0){
        $result=$basical[$array[0]].$advanced[2].$basical[$array[1]].$advanced[1].$basical[$array[2]].$advanced[0];
    }elseif($array[0]!=0&&$array[1]==0&&$array[2]!=0&&$array[3]!=0){
        $result=$basical[$array[0]].$advanced[2].$basical[0].$basical[$array[2]].$advanced[0].$basical[$array[3]];
    }elseif($array[0]!=0&&$array[1]!=0&&$array[2]==0&&$array[3]!=0){
        $result=$basical[$array[0]].$advanced[2].$basical[$array[1]].$advanced[1].$basical[0].$basical[$array[3]];
    }elseif($array[0]==0&&$array[1]!=0&&$array[2]!=0&&$array[3]!=0){
        $result=$basical[0].$basical[$array[1]].$advanced[1].$basical[$array[2]].$advanced[0].$basical[$array[3]];
    }elseif($array[0]==0&&$array[1]==0&&$array[2]==0&&$array[3]==0){
        $result=$basical[0];
    }else{
        $result=$basical[$array[0]].$advanced[2].$basical[$array[1]].$advanced[1].$basical[$array[2]].$advanced[0].$basical[$array[3]];
    }
    return $result;
}
function levelthr($array){
    global $basical,$advanced;
    if($array[0]!=0&&$array[1]==0&&$array[2]==0){
        $result=$basical[$array[0]].$advanced[1];
    }elseif($array[0]!=0&&$array[1]!=0&&$array[2]==0){
        $result=$basical[$array[0]].$advanced[1].$basical[$array[1]].$advanced[0];
    }elseif($array[0]!=0&&$array[1]==0&&$array[2]!=0){
        $result=$basical[$array[0]].$advanced[1].$basical[0].$basical[$array[2]];
    }else{
        $result=$basical[$array[0]].$advanced[1].$basical[$array[1]].$advanced[0].$basical[$array[2]];
    }
    return $result;
}
function leveltwo($array){
    global $basical,$advanced;
    if($array[1]==0){
        $result=$basical[$array[0]].$advanced[0];
    }else{
        $result=$basical[$array[0]].$advanced[0].$basical[$array[1]];
    }
    return $result;
}
function turn($number){
    global $basical,$advanced,$top;
    $length =strlen($number);
    if($length<=12){
        $headerlen = $length%4;
        for($i=0;$i < $headerlen;$i++){
            $header[$i]=$number[$i];
        }
        $maincount = ($length-$length%4)/4;
        $k=$headerlen;
        for($i=0;$i < $maincount;$i++){
            for($j=0;$j < 4;$j++){
                $num_array[$i][$j]=$number[$k];
                $k++;
            }
        }
        if($headerlen==1){
            $str .= $basical[$header[0]].$top[$maincount];
        }elseif($headerlen==2){
            $str .= leveltwo($header).$top[$maincount];
        }elseif($headerlen==3){
            $str .= levelthr($header).$top[$maincount];
        }
        for($i=0;$i < $maincount;$i++){
            $step = levelfor($num_array[$i]);
            if($step != $basical[0]){
                $str .= $step.$top[$maincount-$i-1];
            }else{
                $str .= $step;
            }
            
        }
    }else{
        $str ="这个数字用汉字无法描述";
    }
    $str = str_replace($basical[0].$basical[0],$basical[0],$str);
    if(substr($str,-2)==$basical[0]&&strlen($str)>2){
        $str = substr($str,0,strlen($str)-2);
    }
    return $str;
}
echo turn("98000005498");
?>

[ 本帖最后由 muqiao 于 2006-12-28 04:03 编辑 ]

作者: muqiao   发布时间: 2006-12-28

九百八十亿零五千四百九十八

作者: muqiao   发布时间: 2006-12-28

echo turn("894845106450");

八千九百四十八亿四千五百一十万六千四百五十

作者: muqiao   发布时间: 2006-12-28

echo turn("800800800800");

八千零八亿零八十万零八百

作者: muqiao   发布时间: 2006-12-28

呵呵能把规律归纳好,在压缩一下代码就更好了,里面有很多类似重复的。

作者: thankwsx   发布时间: 2006-12-28

复制PHP内容到剪贴板
PHP代码:

<?php
// 进位转换,整数部分
function num2chn($num, $length = 4) {
  $char = array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖");
  $div[1] = array("拾","佰","仟");
  $div[4] = array("万","亿","万亿");
  $digit = str_rsplit($num, $length);
  $digit_count = count($digit) - 1;
  for($i = $digit_count; $i >= 0; $i-- ){
            if($length == 1) {
              $chn .= $char[$digit[$i]] . ($digit[$i] != "0" ? $div[$length][$i-1] : "" );
            }else{
                    $chn .= replace_zero(num2chn($digit[$i], 1)) . $div[$length][$i-1];
            }
  }
  return $chn;
}
// 从右分割字符串
function str_rsplit($str, $length = 1) {
  $str = strrev($str);
  $ret = str_split($str, $length);
  foreach ( $ret as &$str)
    $str = strrev($str);
   return $ret;
}
// 替换"零"
function replace_zero($char) {
  $pattern = array("/(零)+$/", "/(零)+/");
  $replacement = array("", "零");
  return preg_replace($pattern, $replacement, $char);
}

echo num2chn(123456789);

?>

[ 本帖最后由 hemon 于 2007-1-29 23:31 编辑 ]

作者: hemon   发布时间: 2007-01-29

复制PHP内容到剪贴板
PHP代码:

<? php
//hemon [at] gmail.com 2007-1-3
function num2chn($num){
    $char = array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖");
    $carry = array("分","角","圆","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万亿","拾","佰","仟");
    $base = 2;
    if(strpos($num, '.') > 0){
        $base = 0;
        $num = str_replace(".","", $num);
    }
    $length = strlen($num) - 1;
    for($i = 0; $i <= $length; $i++){
        $chn .= $char[$num{$i}] . $carry[$length - $i + $base];
    }
    // 替换“零”
    $pattern = array("/(零)(仟|佰|拾)+/", "/(零)+/", "/(零)+(圆|万|亿|万亿)/","/(亿)+(亿|万)(零)?/");
    $replacement = array("零","零","$2","亿零");
    $chn = preg_replace($pattern, $replacement, $chn);
    return $chn;
}

echo num2chn(1234567890);
?>

[ 本帖最后由 hemon 于 2007-1-30 00:54 编辑 ]

作者: hemon   发布时间: 2007-01-30

LZ代码基本无法维护。。。=。=||

作者: Phzzy   发布时间: 2007-01-31