前段时间在 segmentfault 社区看到一个很有意思的题目
数字转中文(PHP语言描述)
一开始我是这样写的
<?php
$str = 1237124129124;
//将一个字符串转换为数组
$arr = str_split((string)$str,1);
$cns = ['零','一','二','三','四','五','六','七','八','九'];
foreach ($arr as $key) {
echo $cns[$key];
}
//一二三七一二四一二九一二四
然后题主回复我说:根据你这个我只能做出来十以内的
开始我的理解太过简单,所以又写了一下
思路是这样的
第一次写,已经可以把阿拉伯数字翻译为中文数字,但是真正的数都是有数阶(个、十、百、千)的。
显然简单的翻译还不能称之为数
那么思路就来了,计算出每个数的权位,加上权位不就可以了吗
123 翻译为中文就是 一二三
下一步就是加上权位
一位数是个
二位数是十
三位数是千
...
以此类推
这样不就很明显用数组表示最合适不过了
['','十','百','千','万','十','百','千','亿','十','百','千']
这样遍历的时候简单合并不就Ok 了吗?
先不管对错,试一下(以123为例)
遍历
1=>一 +
2=>二 + 十
3=>三 + 百
结果为 一二十三百
很明显,权位是反的
有两种解决思路,第一种先判断位数,计算数阶,第二种是反向遍历,从个位遍历起
第二种
php 中 先翻转 123 => 321
遍历之后输出 一十二百三
反转字符串即为正解
PHP 中有很多字符串反转函数,但是中文反转会乱码,使用mb_substr()
函数解决中文乱码
完整代码如下
<?php
function IntToString($num)
{
$cns = ['零','一','二','三','四','五','六','七','八','九'];
$ws = ['','十','百','千','万','十','百','千','亿','十','百','千'];
$str = '';
foreach (array_reverse(str_split((string)$num,1)) as $key => $value)
$str .= $ws[$key].$cns[$value];
$temp = '';//反转字符串
for($i = strlen($str)-1; $i>=0; $i--)
$temp .= mb_substr($str,$i,1,'utf-8');
return $temp;
}
echo IntToString(231231251237);
////二千三百一十二亿三千一百二十五万一千二百三十七
这次直接支持支持千亿级别的数,修改 ws 数组可以无限扩充
修改$cns数组
让这个函数支持,数字大写,支持人民币结算
第一种
//数阶数组
$rank = ['','十','百','千','万','十','百','千'];
//中文数字数组
$cns = ['零','一','二','三','四','五','六','七','八','九'];
//数字转数组
$arr = str_split((string)$num,1);
//获取数阶数组
$nowRank = array_reverse(array_slice($rank,0,strlen($num)));
foreach ($arr as $key => $value) {
echo $cns[$value].$nowRank[$key];
}
中华语言博大精深
如果输入14 会输出 一十四,而实际我们只会读为十四;
如果输入1000会输出一千零百零十零,而实际我们只会读为一千;
如果输入1020会输出一千零百二十零,而实际我们只会读为一千零二十;
下一步需要解决这些问题,如果解决了,会更新此文
好了,不多说了,接着搬砖了
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。