php反转数字_阿拉伯数字转中文数字思路及解决算法(以PHP语言描述)

前段时间在 segmentfault 社区看到一个很有意思的题目

数字转中文(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()函数解决中文乱码

完整代码如下

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会输出一千零百二十零,而实际我们只会读为一千零二十;

下一步需要解决这些问题,如果解决了,会更新此文

好了,不多说了,接着搬砖了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值