首頁  >  問答  >  主體

php - 面試題,將100之內的數字中文轉換..

如何將數字轉為文字
比如說1 => 一,2=> 二, ..., 15=》十五
我目前想的是把中文存到一個數組中

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

不過這樣也太麻煩了 如何將輸入數字轉換為中文,有沒有更簡單的方式?

最終實現的結果是這樣的:
輸入 12
輸出

 一二三四五六七八九十十一十二
PHP中文网PHP中文网2683 天前937

全部回覆(6)我來回復

  • 淡淡烟草味

    淡淡烟草味2017-06-14 10:52:09

    雷雷

    回覆
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-06-14 10:52:09

    如果你能用文字將數字的轉換過程描述清楚,那麼寫程式碼就是個翻譯的過程。

    演算法其實是業務邏輯很奇怪的業務邏輯而已,重點在於分析這個業務邏輯

    阿拉伯數字轉中文數字,小學沒畢業也會寫,腦子裡一定有一套方法去完成這個轉換過程。所以這裡的考察重點就是,對問題的抽象過程。要抽象的準確,首先得對問題本身有一個全面的分析了解,找出規律。比數位轉換過程中,0什麼時候叫十,什麼時候叫零。這個過程,在腦中執行的太自然了,以至於去分析它的情況,找出規律,都還是需要一定能力的。

    推薦這篇文章,文章開始的分析就是抽象過程,對程式設計很重要

    回覆
    0
  • 漂亮男人

    漂亮男人2017-06-14 10:52:09

    雷雷

    回覆
    0
  • PHP中文网

    PHP中文网2017-06-14 10:52:09

    如何將快速將數字轉為文字
    比如說 1 => 一,2=> 二, ..., 15=》十五
    我當前想的是把中文存到一個數組中

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

    不過這樣也太麻煩了 如何將輸入數字轉換為中文,有沒有更簡單的方式?

    最終實現的結果是這樣的:
    輸入 12
    輸出

    一二三四五六七八九十十一十二

    下面是 JavaScript 的實作

    觀察漢字的數字表示

    漢字明確地指定了 數的階 例如 一百零一 裡面有百這個階 (個十百千萬)

    2 >>>> 二個
    10 >>>> 一十 >>>>

    16 >>>> 一十 六個 >>>> 十六

    105 >>>> 一百 零十 五個 >>>> 一百零五

    1024 >>>> 一千 零百 二十 四個 >>>> 一千零二十四

    四個

    >>>> 一千零二十四

    可以看到它的表示法可以看成是 值 + 階 的形式。

    此外滿足以下條件的時候

    需要省略階或值 10 對應
    一十 寫作 110 對應
    一百一十零個

    一百一.
    根據以上思考 應該得出的程式思路是這樣的:

    1. 輸入數字

      n

    2. n 映射到一個陣列 tokens 上。 例如 8 變成 ["八"], 101 變成 ["一", "零", "一"]

    3. 新增階

      101 變成 ["一", "百", "十", "零", "一", "個"]

    4. 篩選 例如

      一百十零一個 變成最簡形式 一百零一

    工具函數

    // 数字到汉字的映射表 
    var mapHans = ['零', '一','二','三','四','五','六','七','八','九','十'];
    
    // 用 n 得到汉字 输入 0 得到 '零'
    var getHans = n => mapHans[n]; 
    
    // 数字长度到汉字数级的映射表 
    var mul = ['十', '百', '千', '万']
    
    // ['i', 'love', 'my', 'wife'] >>>> ilovemywife 
    var arr2str = arr => arr.join(''); 
    
    // 输入 5 产生 [1, 2, 3, 4, 5]
    var arrGenerator = n => (
        new Array(n).fill(0).map((e, idx) => idx + 1)
    )

    實作

    先實現

    大於 10數字映射到漢字的數制

    例如輸入

    101 回傳 一百零一

    利用上面寫的工具函數去做會快一點

    var toHans = n => {
        // 比如输入 101 返回 ['一', '零', '一']
        var tokens = n.toString().split('').map(getHans); 
        
        // 对数阶的处理  如果上一步得到 ['一', '零', '一'] 
        // 那么at就是 ['百', '十']
        var at = mul.slice(0, tokens.length - 1).reverse();   
        
        // 归约 
        return tokens.reduce((acc, cur) => {
            acc.push(cur); 
            acc.push( at.shift() )
            
            return acc; 
            
            // 这个reduce将会把 tokens 和 at 耦合在一块 
            // ['一', '零', '一']  和 ['百', '十'] 耦合就是: 
            // ['一', '百', '零', '十', '一', undefined]
            // 下一步的两个 filter 就是要剔除多余的项 
        }, []).filter(e => e !== undefined).filter((e, idx, its) => {
            if (e === '零'){
                if (idx === its.length - 1) {
                    // 针对 10 >>>> [一 十 零] 这种情况
                    return false; 
                } else {
                    // 针对 101 >>>> [一 百 零 十 一] 这种情况 
                    its[idx + 1] = null;
                }
            } else if (idx === 0 && e === '一' && its[idx + 1] === '十'){
                // 针对 12 >>>> [一 十 二] 这种情况 
                return false; 
            }
            // 下面还可以再添加。。 不过应该没了。
            return e; 
        }); 
    };

    簡單的檢定 測試轉換

    2 4 6 8 16 32 ...

    // 2 的 n 次方  
    var twotwotwo = n => (
        new Array(n).fill(2).reduce((acc, cur, idx) => {
            acc = acc * cur; 
            return acc; 
        }, 1)
    )
    
    // 打印机 
    var logger = (item, idx) => console.log(`第 ${idx + 1} 个:`, item); 
    
    // test code 
    function test4toHans(n) {
        var res = arrGenerator(n).map(twotwotwo).map(toHans).map(arr2str); 
        res.forEach(logger); 
    }
    遍歷數字 .... 從 1 到 n
    var main = n => {
        var numbers = arrGenerator(n); 
        
        return numbers.map(toHans).map(arr2str); 
    } 

    測驗


    回覆
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-06-14 10:52:09

    https://github.com/wilon/php-...

    PHP數字轉為漢字描述,人民幣大寫

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-06-14 10:52:09

    支援千億級的數,修改 ws 數組可以無限擴充,修改cns數組為繁體可以用於人民幣大寫

    <?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);
    ////二千三百一十二亿三千一百二十五万一千二百三十七

    附上思路
    /a/11...

    回覆
    0
  • 取消回覆