美文网首页
整数转中文

整数转中文

作者: PYM_祺 | 来源:发表于2018-01-09 13:47 被阅读0次

要求:输入一个整数,输出这个整数的中文字符串
:该数不能大于百兆,因为过大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);

相关文章

网友评论

      本文标题:整数转中文

      本文链接:https://www.haomeiwen.com/subject/fewwnxtx.html