阿拉伯数字转中文数字表示[PHP]

原创
2014/06/18 16:45
阅读数 578

在一些时候需要用中文来显示顺序更加合适,最显著的就是书的章节,第一章,第二章,第三章 ...第二百零三章;

转换不是很麻烦,但一些问题是不可忽视的

  1. 110 应该为一百一十,这没问题,但11就不能是一十一;
  2. 10010 -> 一万零一十;
  3. 100000000 -> 一亿 ,不能是 一亿万;

先上基础数据


static public $_chapterIndexes = array('零','一','二','三','四','五','六','七','八','九','十','百','千','万','亿');

这里虽然后面的万,亿写在一起,但逻辑中还是会被切分开;

我这里选择将数字转为字符串切为数组,这样会比较简单一点;

/**
 * 转换数字为中文数字
 * @param type $index
 * @return type
 * @author xilei
 */
static public function chapterIndex($index){
   $result = array();
   $nums = str_split(strval($index), 1);
   krsort($nums,SORT_NUMERIC);
   $i = 0; $lastv = -1; $mi = 1;$gi = 0;
   $maxIndexes = array();
   foreach($nums as $v){
        if($gi==4 * $mi){
          //添加 万,亿
          $end = end($result);
          if(empty($maxIndexes))
             $maxIndexes = array_slice(self::$_chapterIndexes,13);
          if(in_array($end, $maxIndexes)){
             array_pop($result);
          }
          $result[] = $maxIndexes[$mi-1]; 
          $i=0;$mi++;
        }
        if($i!=0 && $v!=0){
            $result[] = self::$_chapterIndexes[9+$i];
        }
        if($lastv!=0 || $v!=0){
            $result[] = self::$_chapterIndexes[$v];
        }
        $i++;$lastv = $v;$gi++;
   }
  krsort($result,SORT_NUMERIC);
  $count = count($result);
  //十零 => 十
  if($count!=1 && $result[0] == self::$_chapterIndexes[0]){
       array_pop($result);
  }
  //一十 => 十
  if($index>=10 && $index<100 
        && $result[$count-1] == self::$_chapterIndexes[1]){
       array_shift($result);
  }
  return implode($result);
}

在第一个if中是添加 万和 亿,但要避免出现之前说的万亿问题,所以要检查最后一个是否为这些单位中的一个,并移除;

第二个if就是添加十,百,千,

第三个if就是转换普通的数字0~9,但有一点要注意就是上一次的值和当前值不能同时为0,避免出现 "零零"的状况;

最后两个判断是我在foreach无法过滤的;

第一个是 对零零问题的最后一步检查,因为按照这样的逻辑,只要出现了"零零"的情况就肯定有一个零已经放进去了,

但这也是我们需要的,唯一就是不能出现在最后一位上;

第二个是 "一十"问题,由于十的特殊性在一十时会省略一;

理论上可以支持到万亿数字;

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部