【演算法】數字讀法轉漢字
阿新 • • 發佈:2019-01-04
今天和同學聊天
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;
}
執行結果
一萬
一萬零
一萬零二百
一萬零二百一十
一萬零二百一十九億
一萬零二百一十九億
一萬零二百一十九億九千
一萬零二百一十九億九千零
一萬零二百一十九億九千零
一萬零二百一十九億九千零四萬
一萬零二百一十九億九千零四萬一千
一萬零二百一十九億九千零四萬一千零
一萬零二百一十九億九千零四萬一千零三十