要求:输入一个整数,输出这个整数的中文字符串
注:该数不能大于百兆,因为过大PHP会转为科学计数法,该算法无法处理。
思路:
将数组按4位为一组,分别获取每组的汉字,再拼接起来。
如123456789,分成 1,2345,6789。
分别获得 “一”,“二千三百四十五”,“六千七百八十九”,
拼成 “一” + “亿” + “二千三百四十五” + “万” + “六千七百八十九”。
难点:对于“零”的处理。
细节:将“一十二”处理为“十二”。
<?php
function getAnswer($num) {
$partMap = ['', '万', '亿', '兆'];
$numPartArr = getPartArr($num);
$result = '';
// 分别处理4位数
foreach ($numPartArr as $key => $value) {
// 获取4位数的汉字输出
$nowPartStr = getPartStr($value);
// 如果该4位数不为"零",则拼上相应的单位,否则不拼接
$result = ($nowPartStr != "零") ? ($nowPartStr . $partMap[$key] . $result) : $result;
// 如该4位数,没有"千"位且不为"零",则在前面拼上"零"
$result = (!strpos($nowPartStr, "千") && $nowPartStr != "零") ? "零" . $result : $result;
}
// 如果答案的第一个字为零,则删掉
if (mb_substr($result, 0, 1) == '零') {
$result = mb_substr($result, 1);
}
echo $result, "<br>";
}
// 将数组拆分为4位一组
function getPartArr($num) {
$sNum = (string)$num;
$sNum = implode('', array_reverse(str_split($sNum)));
$numArr = str_split($sNum, 4);
foreach ($numArr as &$value) {
$value = implode('', array_reverse(str_split($value)));
}
return $numArr;
}
// 4位以内的数字转文字
function getPartStr($num) {
$numMap = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
$weiMap = ['', '十', '百', '千'];
$numArr = array_reverse(str_split($num));
$result = '';
$zeroFlag = false;
// 分别出处理每位数
foreach ($numArr as $key => $value) {
// 如果该数不为0,则拼上汉字和单位
if ($value != 0) {
$result = $numMap[$value] . $weiMap[$key] . $result;
}
// 如果该数为0,且之前没有拼上过“零”,则在前拼上“零”
else if (!$zeroFlag) {
$zeroFlag = true;
$result = "零" . $result;
}
}
// 如果最后一个字为“零”,则删掉
if (mb_strlen($result)>1 && mb_substr($result, -1) == '零') {
$result = mb_substr($result, 0, -1);
}
// 如果第一个字为“零”,或头两个字为“一十”,则删掉第一个字
if ((mb_strlen($result)>1 && mb_substr($result, 0, 1) == '零') ||
mb_substr($result, 0, 2) == '一十'
) {
$result = mb_substr($result, 1);
}
return $result;
}
// 输出 “一千零二十三亿零五十六万一千零三”
getAnswer(102300561003);
// 输出 “一千亿零五十万零三”
getAnswer(100000500003);
// 输出 “一千亿零三”
getAnswer(100000000003);
// 输出 “一千亿”
getAnswer(100000000000);
// 输出 “一千亿零五百零六万一千一百零三”
getAnswer(100005061103);
// 输出 “十二兆一千亿零五百零六万一千一百零三”
getAnswer(12100005061103);
// 输出 “十二兆一千亿零五百零六万一千零一十三”
getAnswer(12100005061013);
// 输出 “二”
getAnswer(2);
// 输出 “十二”
getAnswer(12);
// 输出 “一百二十三”
getAnswer(123);
// 输出 “一千二百三十四”
getAnswer(1234);
// 输出 “一千二百零四”
getAnswer(1204);
// 输出 “一千零三十四”
getAnswer(1034);
// 输出 “一千零四”
getAnswer(1004);
// 输出 “一万零一十四”
getAnswer(10014);