php生成0-100数字,【php】面试题,将100之内的数字中文转换..

本文探讨了一种简化的方法,通过分析数字的组成和汉字的数制表示,实现从阿拉伯数字到中文数字(如12345转为一二三四五)的快速转换。涉及数字映射数组、阶数处理和字符串操作,适用于大规模和复杂格式的数字转汉字需求,包括对零、十进位和特定情况的处理规则。
摘要由CSDN通过智能技术生成

如何将快速将数字转为文字

比如说 1 => 一,2=> 二, …, 15=》十五

我当前想的是把中文存到一个数组中

$arr = ['一','二','三','四','五','六','七','八','九','十'];

不过这样也太麻烦了 如何将输入数字转换为中文,有没有更简单的方式?

最终实现的结果是这样的:

输入 12

输出

一二三四五六七八九十十一十二

回答

$number=57;

$arr=array(

'1' => '一',

'2' => '二',

'3' => '三',

'4' => '四',

'5' => '五',

'6' => '六',

'7' => '七',

'8' => '八',

'9' => '九',

'10' => '十',

);

if($number>10){

//倍数

$bs = (int)($number/10);

//余数

$ys = $number%10;

echo $arr[$bs].$arr[10].$arr[$ys];

}else{

echo $arr[$number];

}

如何将快速将数字转为文字

比如说 1 => 一,2=> 二, …, 15=》十五

我当前想的是把中文存到一个数组中

$arr = ['一','二','三','四','五','六','七','八','九','十'];

不过这样也太麻烦了 如何将输入数字转换为中文,有没有更简单的方式?

最终实现的结果是这样的:

输入 12

输出

一二三四五六七八九十十一十二

下面是 JavaScript 的实现

观察汉字的数字表示

汉字显式地指定了 数的阶 比如 一百零一 里面有百这个阶 (个十百千万)

2 >>>> 二个

10 >>>> 一十 >>>> 十

16 >>>> 一十 六个 >>>> 十六

105 >>>> 一百 零十 五个 >>>> 一百零五

1024 >>>> 一千 零百 二十 四个 >>>> 一千零二十四

可以看到它的表示法可以看成是 值 + 阶 的形式。

此外满足以下条件的时候 需要省略阶或者值

10 对应 一十 写作 十

110 对应 一百一十零个 写作 一百一十

…. 等等

根据以上思考 应该得出的编程思路是这样的:

输入数字 n

把 n 映射到一个数组 tokens 上。 比如 8 变成 ["八"], 101 变成 ["一", "零", "一"]

添加阶 101 变成 ["一", "百", "十", "零", "一", "个"]

筛选 比如 一百十零一个 变成最简形式 一百零一

工具函数

// 数字到汉字的映射表

var mapHans = ['零', '一','二','三','四','五','六','七','八','九','十'];

// 用 n 得到汉字 输入 0 得到 '零'

var getHans = n => mapHans[n];

// 数字长度到汉字数级的映射表

var mul = ['十', '百', '千', '万']

// ['i', 'love', 'my', 'wife'] >>>> ilovemywife

var arr2str = arr => arr.join('');

// 输入 5 产生 [1, 2, 3, 4, 5]

var arrGenerator = n => (

new Array(n).fill(0).map((e, idx) => idx + 1)

)

实现

先实现 大于 10 的 数字映射到汉字的数制 上

比如输入 101 返回 一百零一

利用上面写的工具函数去做会快些

var toHans = n => {

// 比如输入 101 返回 ['一', '零', '一']

var tokens = n.toString().split('').map(getHans);

// 对数阶的处理 如果上一步得到 ['一', '零', '一']

// 那么at就是 ['百', '十']

var at = mul.slice(0, tokens.length - 1).reverse();

// 归约

return tokens.reduce((acc, cur) => {

acc.push(cur);

acc.push( at.shift() )

return acc;

// 这个reduce将会把 tokens 和 at 耦合在一块

// ['一', '零', '一'] 和 ['百', '十'] 耦合就是:

// ['一', '百', '零', '十', '一', undefined]

// 下一步的两个 filter 就是要剔除多余的项

}, []).filter(e => e !== undefined).filter((e, idx, its) => {

if (e === '零'){

if (idx === its.length - 1) {

// 针对 10 >>>> [一 十 零] 这种情况

return false;

} else {

// 针对 101 >>>> [一 百 零 十 一] 这种情况

its[idx + 1] = null;

}

} else if (idx === 0 && e === '一' && its[idx + 1] === '十'){

// 针对 12 >>>> [一 十 二] 这种情况

return false;

}

// 下面还可以再添加。。 不过应该没了。

return e;

});

};

简单的测试 测试转化 2 4 6 8 16 32 … 成 二 四 八 十六 三十二 …

// 2 的 n 次方

var twotwotwo = n => (

new Array(n).fill(2).reduce((acc, cur, idx) => {

acc = acc * cur;

return acc;

}, 1)

)

// 打印机

var logger = (item, idx) => console.log(`第 ${idx + 1} 个:`, item);

// test code

function test4toHans(n) {

var res = arrGenerator(n).map(twotwotwo).map(toHans).map(arr2str);

res.forEach(logger);

}

d71669e396487b70df2134a6407f4e03.png

遍历数字

…. 从 1 到 n

var main = n => {

var numbers = arrGenerator(n);

return numbers.map(toHans).map(arr2str);

}

测试

1be5bf2877555e7f3bf43e4aada62079.png

如果你能用文字将数字的转化过程描述清楚,那么写代码就是个翻译的过程。

算法其实是业务逻辑很奇怪的业务逻辑而已,重点在于分析这个业务逻辑

阿拉伯数字转中文数字,小学没毕业也会写,脑子里一定有一套方法去完成这个转化过程。所以这里的考察重点就是,对问题的抽象过程。要抽象的准确,首先得对问题本身有一个全面的分析了解,找出规律。比数字转化过程中,0什么时候叫十,什么时候叫零。这个过程,在脑子里执行的太自然了,以至于去分析它的情况,找出规律,都还是需要一定能力的。

推荐这篇文章,文章开始的分析就是抽象过程,对编程很重要

$setnumber = 99;

$chiNum = array('十','一','二','三','四','五','六','七','八','九','十');

if($setnumber < 100 && $setnumber >= 1) {

for($i = 1;$i<=$setnumber;$i++) {

$setstrnumber = (string)$i;

$count = strlen($setstrnumber);

if($count == 1) {

echo $chiNum[$i]."
";

} else {

$setchinum = '';

if($setstrnumber[0] != 1) {

$setchinum .= $chiNum[$setstrnumber[0]];

}

$setchinum .= $chiNum[0];

if(intval($setstrnumber[1]) != 0) {

$setchinum .= $chiNum[$setstrnumber[1]];

}

echo $setchinum."
";

}

}

}

支持千亿级别的数,修改 ws 数组可以无限扩充,修改cns数组为繁体可以用于人民币大写

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);

二千三百一十二亿三千一百二十五万一千二百三十七

PHP数字转为汉字描述,人民币大写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值