前段時間在 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會輸出一千零百二十零,而實際咱們只會讀爲一千零二十;
下一步須要解決這些問題,若是解決了,會更新此文
好了,很少說了,接着搬磚了