2019独角兽企业重金招聘Python工程师标准>>>
在一些时候需要用中文来显示顺序更加合适,最显著的就是书的章节,第一章,第二章,第三章 ...第二百零三章;
转换不是很麻烦,但一些问题是不可忽视的
- 110 应该为一百一十,这没问题,但11就不能是一十一;
- 10010 -> 一万零一十;
- 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无法过滤的;
第一个是 对零零问题的最后一步检查,因为按照这样的逻辑,只要出现了"零零"的情况就肯定有一个零已经放进去了,
但这也是我们需要的,唯一就是不能出现在最后一位上;
第二个是 "一十"问题,由于十的特殊性在一十时会省略一;
理论上可以支持到万亿数字;