整数转中文

要求:输入一个整数,输出这个整数的中文字符串
:该数不能大于百兆,因为过大PHP会转为科学计数法,该算法无法处理。
思路:
将数组按4位为一组,分别获取每组的汉字,再拼接起来。
如123456789,分成 1,2345,6789。
分别获得 “一”,“二千三百四十五”,“六千七百八十九”,
拼成 “一” + “亿” + “二千三百四十五” + “万” + “六千七百八十九”。
难点:对于“零”的处理。
细节:将“一十二”处理为“十二”。

 $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, "
"; } // 将数组拆分为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);

你可能感兴趣的:(整数转中文)