今天和同学聊天
me:你大爷
other:你二大爷
me:你三大爷
...
突然想到能否用程序实现数字转化为汉字
例如:1040 -> 一千零四十
代码如下
<?php
$arr = [
0 => '零',
1 => '一',
2 => '二',
3 => '三',
4 => '四',
5 => '五',
6 => '六',
7 => '七',
8 => '八',
9 => '九',
10 => '十',
100 => '百',
1000 => '千',
10000 => '万',
100000000 => '亿',
];
$i = 1021990041030;
getName($i, $arr);
function getName($i, $arr) {
$strName = '';
$flag = 0;
$billions = intval($i / 100000000);
if ($billions) {
$strName = wanName($billions, $arr, $strName, $flag);
$strName .= $arr[100000000];
}
$i = $i % 100000000;
echo $strName . PHP_EOL;
if ($i) {
$strName = wanName($i/10000, $arr, $strName, $flag);
$strName .= $arr[10000];
}
$strName = wanName($i%10000, $arr, $strName, $flag);
echo $strName . PHP_EOL;
return $strName;
}
// 递归,$i是要转的数字,$arr定义对应的数组,$strName输出的名字,
// 因为1004 -> 一千零四,而不是一千零零四。$flag标记上一个是否为零,$divisor 是除数
function wanName($i, $arr, $strName, $flag = 1, $divisor = 10000) {
$tmp = intval($i / $divisor);
if ($tmp) {
$flag = 1;
$strName .= $arr[$tmp] . $arr[$divisor];
} else if($flag){
$flag = 0;
$strName .= $arr[0];
}
$i = $i % $divisor;
if ($i == 0) {
return $strName;
}
echo $strName . PHP_EOL;
if ($divisor > 10) {
$strName = wanName($i, $arr, $strName, $flag, $divisor/10);
} else {
$i = $i % 10;
$strName .= $arr[$i];
}
return $strName;
}
运行结果
一万
一万零
一万零二百
一万零二百一十
一万零二百一十九亿
一万零二百一十九亿
一万零二百一十九亿九千
一万零二百一十九亿九千零
一万零二百一十九亿九千零
一万零二百一十九亿九千零四万
一万零二百一十九亿九千零四万一千
一万零二百一十九亿九千零四万一千零
一万零二百一十九亿九千零四万一千零三十