84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
如何將數字轉為文字比如說1 => 一,2=> 二, ..., 15=》十五我目前想的是把中文存到一個數組中
$arr = ['一','二','三','四','五','六','七','八','九','十'];
不過這樣也太麻煩了 如何將輸入數字轉換為中文,有沒有更簡單的方式?
最終實現的結果是這樣的:輸入 12輸出
一二三四五六七八九十十一十二
认证高级PHP讲师
雷雷
如果你能用文字將數字的轉換過程描述清楚,那麼寫程式碼就是個翻譯的過程。
演算法其實是業務邏輯很奇怪的業務邏輯而已,重點在於分析這個業務邏輯
阿拉伯數字轉中文數字,小學沒畢業也會寫,腦子裡一定有一套方法去完成這個轉換過程。所以這裡的考察重點就是,對問題的抽象過程。要抽象的準確,首先得對問題本身有一個全面的分析了解,找出規律。比數位轉換過程中,0什麼時候叫十,什麼時候叫零。這個過程,在腦中執行的太自然了,以至於去分析它的情況,找出規律,都還是需要一定能力的。
推薦這篇文章,文章開始的分析就是抽象過程,對程式設計很重要
如何將快速將數字轉為文字比如說 1 => 一,2=> 二, ..., 15=》十五我當前想的是把中文存到一個數組中
下面是JavaScript的實作
JavaScript
漢字明確地指定了 數的階 例如一百零一裡面有百這個階 (個十百千萬)
一百零一
2>>>>二個10>>>>一十>>>>十
2
二個
10
一十
十
16>>>>一十六個>>>>十六
16
六個
十六
105>>>>一百零十五個>>>>一百零五
105
一百
零十
五個
一百零五
1024>>>>一千零百二十四個>>>>一千零二十四
1024
一千
零百
二十
四個
一千零二十四
>>>>一千零二十四
可以看到它的表示法可以看成是值 + 階的形式。
值 + 階
此外滿足以下條件的時候 需要省略階或值10對應一十寫作十110對應一百一十零個一百一.
需要省略階或值10對應一十寫作十110對應一百一十零個
寫作
110
n
n映射到一個陣列tokens上。 例如8變成["八"],101變成["一", "零", "一"]
映射到一個陣列
上。 例如
變成
,
101變成["一", "百", "十", "零", "一", "個"]
一百十零一個變成最簡形式一百零一
變成最簡形式
// 数字到汉字的映射表 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; }); };
24681632...
// 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); }
https://github.com/wilon/php-...
PHP數字轉為漢字描述,人民幣大寫
支援千億級的數,修改 ws 數組可以無限擴充,修改cns數組為繁體可以用於人民幣大寫
$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什麼時候叫十,什麼時候叫零。這個過程,在腦中執行的太自然了,以至於去分析它的情況,找出規律,都還是需要一定能力的。
推薦這篇文章,文章開始的分析就是抽象過程,對程式設計很重要
雷雷
如何將快速將數字轉為文字
比如說 1 => 一,2=> 二, ..., 15=》十五
我當前想的是把中文存到一個數組中
不過這樣也太麻煩了 如何將輸入數字轉換為中文,有沒有更簡單的方式?
最終實現的結果是這樣的:
輸入 12
輸出
下面是
JavaScript
的實作觀察漢字的數字表示
漢字明確地指定了 數的階 例如
一百零一
裡面有百這個階 (個十百千萬)2
>>>>二個
10
>>>>一十
>>>>十
16
>>>>一十
六個
>>>>十六
105
>>>>一百
零十
五個
>>>>一百零五
四個1024
>>>>一千
零百
二十
四個
>>>>一千零二十四
>>>>
一千零二十四
可以看到它的表示法可以看成是
根據以上思考 應該得出的程式思路是這樣的:值 + 階
的形式。n
n
映射到一個陣列
tokens上。 例如
8變成
["八"],
101變成
["一", "零", "一"]101
變成
["一", "百", "十", "零", "一", "個"]一百十零一個
變成最簡形式
一百零一實作 先實現
大於 10
例如輸入的
數字映射到漢字的數制上
101
利用上面寫的工具函數去做會快一點 簡單的檢定 測試轉換回傳
一百零一2
4
6
8
16
32
...
遍歷數字
.... 從 1 到 n
測驗https://github.com/wilon/php-...
PHP數字轉為漢字描述,人民幣大寫
支援千億級的數,修改 ws 數組可以無限擴充,修改cns數組為繁體可以用於人民幣大寫
附上思路
/a/11...