阿拉伯數字轉中文數字思路及解決算法(以PHP語言描述)

前段時間在 segmentfault 社區看到一個頗有意思的題目php

數字轉中文(PHP語言描述)segmentfault

一開始我是這樣寫的數組

<?php

$str = 1237124129124;

//將一個字符串轉換爲數組
$arr = str_split((string)$str,1);

$cns = ['零','一','二','三','四','五','六','七','八','九'];

foreach ($arr as $key) {
    echo $cns[$key];
}

//一二三七一二四一二九一二四

而後題主回覆我說:根據你這個我只能作出來十之內的函數

開始個人理解太過簡單,因此又寫了一下翻譯

思路是這樣的

第一次寫,已經能夠把阿拉伯數字翻譯爲中文數字,可是真正的數都是有數階(個、10、百、千)的。code

顯然簡單的翻譯還不能稱之爲數blog

那麼思路就來了,計算出每一個數的權位,加上權位不就能夠了嗎utf-8

123 翻譯爲中文就是 一二三字符串

下一步就是加上權位get

一位數是個
二位數是十
三位數是千
...

以此類推

這樣不就很明顯用數組表示最合適不過了

['','十','百','千','萬','十','百','千','億','十','百','千']

這樣遍歷的時候簡單合併不就Ok 了嗎?

先無論對錯,試一下(以123爲例)

遍歷

1=>一 + 
2=>二 + 十
3=>三 + 百

結果爲 一二十三百

很明顯,權位是反的

有兩種解決思路,第一種先判斷位數,計算數階,第二種是反向遍歷,從個位遍歷起

第二種

php 中 先翻轉 123 => 321

遍歷以後輸出 一十二百三

反轉字符串即爲正解

PHP 中有不少字符串反轉函數,可是中文反轉會亂碼,使用mb_substr()函數解決中文亂碼

完整代碼以下

<?php

function IntToString($num)
{
    $cns = ['零','一','二','三','四','五','六','七','八','九'];

    $ws = ['','十','百','千','萬','十','百','千','億','十','百','千'];

    $str = '';
    foreach (array_reverse(str_split((string)$num,1)) as $key => $value) 
        $str .= $ws[$key].$cns[$value];
    $temp = '';//反轉字符串
    for($i = strlen($str)-1; $i>=0; $i--)
        $temp .= mb_substr($str,$i,1,'utf-8');

    return $temp;
}

echo IntToString(231231251237);
////二千三百一十二億三千一百二十五萬一千二百三十七

此次直接支持支持千億級別的數,修改 ws 數組能夠無限擴充

修改$cns數組讓這個函數支持,數字大寫,支持人民幣結算

第一種

//數階數組
$rank = ['','十','百','千','萬','十','百','千'];
//中文數字數組
$cns = ['零','一','二','三','四','五','六','七','八','九'];
//數字轉數組
$arr = str_split((string)$num,1);

//獲取數階數組
$nowRank = array_reverse(array_slice($rank,0,strlen($num)));

foreach ($arr as $key => $value) {
    echo $cns[$value].$nowRank[$key];
}

中華語言博大精深

若是輸入14 會輸出 一十四,而實際咱們只會讀爲十四;
若是輸入1000會輸出一千零百零十零,而實際咱們只會讀爲一千;
若是輸入1020會輸出一千零百二十零,而實際咱們只會讀爲一千零二十;

下一步須要解決這些問題,若是解決了,會更新此文

好了,很少說了,接着搬磚了

原文地址:https://blog.codefun.cn/blog/...

相關文章
相關標籤/搜索