JavaScript實現(xiàn)將阿拉伯數(shù)字轉(zhuǎn)換成中文大寫
1. 背景
現(xiàn)在有需求將億元之內(nèi)的阿拉伯數(shù)字轉(zhuǎn)換成中文,例如:1234
轉(zhuǎn)換后變?yōu)?code>一千二百三十四再轉(zhuǎn)換成壹仟貳佰叁拾肆
。
2. 需求分析
以下是對這些規(guī)則的分析:
- 數(shù)字分組:
- 單位映射:
- 零的處理:
- 中文數(shù)字映射:
- 轉(zhuǎn)換邏輯:
2.1 數(shù)字分組
- 將數(shù)字從低位到高位,每四位分為一組。例如,
12345678
可以分為12, 345, 678
。 - 最高位可能不足四位,如
1234
,則直接作為一組處理。
先看一個例子:
1234 -> 一千二百三十四
12340000 -> 一千二百三十四
規(guī)則:
- 當是四位以內(nèi)時,則是千百十表示
- 超過四位時,則是將前幾位按照
規(guī)則1
表示,后面加上萬的單位
通過上述可以得到,將轉(zhuǎn)換的數(shù)字先進行四位拆分。
function numToWords(num) { // 四位進行分割 const numStr = num.toString().replace(/(?=(\d{4})+$)/g, ',') .split(',') .filter(Boolean) }
拆分情況:
123456 -> ,12,3456 -> ['',12,3456] -> [12,3456]
2.2 處理四位轉(zhuǎn)換
循環(huán)拆分后的數(shù)組,每項轉(zhuǎn)換,對四位進行處理。每一位對應的單位不同,轉(zhuǎn)換后再進行拼接即可。
接下來處理四位轉(zhuǎn)換:
- 對于每一組數(shù)字,我們需要將其轉(zhuǎn)換為對應的中文數(shù)字,并添加相應的單位。
- 對于四位數(shù)的每一位(個、十、百、千),我們有對應的單位:
''
(無單位,即個位)、十
、百
、千
。 - 對于更高位的組(萬、億等),我們也有對應的單位:
萬
、億
等。
const chars = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"]; const units = ["", "十", "百", "千"]; function _transform(n) { let result = '' for (let i = 0; i < n.length; i++) { // 轉(zhuǎn)換漢字 const c = chars[+n[i]]; // 加單位 得到單位 let u = units[n.length - 1 - i] result += c + u } return result }
得到結(jié)果:
1234 -> 一千二百三十四
問題1: 如果是1203,得到一千二百零十三 - 需要處理如果是0 則不需要帶單位
問題2: 如果1003,得到一千零零三
- 則需要將連續(xù)的零保留一個
問題3: 如果1200 得到一千二百零零 - 需要去除末尾的零
問題4: 如果100001000 得到一億零零零零萬一千零零零 - 如果四位都是零則保留一個
const chars = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"]; const units = ["", "十", "百", "千"]; function _handleZero(str) { return str.replace(/零{2,}/g, '零').replace(/零+$/, '') } function _transform(n) { // 處理四位全部為0 if (n === '0000') { return chars[0] } let result = '' for (let i = 0; i < n.length; i++) { // 轉(zhuǎn)換漢字 const c = chars[+n[i]]; // 加單位 得到單位 let u = units[n.length - 1 - i] // 處理0不加單位 if (c === chars[0]) { u = '' } result += c + u } // 處理重復零,末尾零情況 return _handleZero(result) }
2.3 循環(huán)分割數(shù)組,添加單位
現(xiàn)在將四位進行分割的數(shù)組,循環(huán)遍歷,添加大的單位。
- 從低位到高位遍歷數(shù)字的每一位。
- 對于每一位,根據(jù)其在組中的位置(個、十、百、千)和組在整體數(shù)字中的位置(無單位、萬、億等),選擇正確的單位和中文數(shù)字進行拼接。
- 處理邊界情況
function numToWords(num) { // 四位進行分割 const numStr = num.toString().replace(/(?=(\d{4})+$)/g, ',') .split(',') .filter(Boolean) const bigUnits = ["", "萬", "億"]; let result = '' for (let i = 0; i < numStr.length; i++) { const part = numStr[i]; const c = _transform(part) let u = bigUnits[numStr.length - i - 1]; // 也是需要考慮當四位為0的情況不需要添加單位 if (c === chars[0]) { u = '' } result += c + u } result = _handleZero(result) return result }
至此轉(zhuǎn)換成中文就結(jié)束。
2.4 大寫轉(zhuǎn)換
- 需要一個映射表,將阿拉伯數(shù)字
0-9
映射到對應的中文數(shù)字零-九
以及大寫形式壹-玖
。
const map = { 零: '零', 一: '壹', 二: '貳', 三: '叁', 四: '肆', 五: '伍', 六: '陸', 七: '柒', 八: '捌', 九: '玖', 十: '拾', 百: '佰', 千: '仟', 萬: '萬', 億: '億', } // 最后結(jié)果轉(zhuǎn)換下即可 result.split('').map(s => map[s]).join('')
附上完整代碼:
function numToWords(num) { const map = { 零: '睿', 一: '壹', 二: '貳', 三: '叁', 四: '肆', 五: '伍', 六: '陸', 七: '柒', 八: '捌', 九: '玖', 十: '拾', 百: '佰', 千: '仟', 萬: '萬', 億: '億', } const bigUnits = ["", "萬", "億"]; const chars = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"]; const units = ["", "十", "百", "千"]; // 四位進行分割 const numStr = num.toString().replace(/(?=(\d{4})+$)/g, ',') .split(',') .filter(Boolean) let result = '' for (let i = 0; i < numStr.length; i++) { const part = numStr[i]; const c = _transform(part) let u = bigUnits[numStr.length - i - 1]; console.log('打印***numStr.length - i - 1', numStr.length - i - 1) if (c === chars[0]) { u = '' } result += c + u console.log('打印***c', c, u, part) } result = _handleZero(result) // 處理一十情況 if (result === '一十') { result = '十' } return result.split('').map(s => map[s]).join('') function _handleZero(str) { return str.replace(/零{2,}/g, '零').replace(/零+$/, '') } function _transform(n) { if (n === '0000') { return chars[0] } let result = '' for (let i = 0; i < n.length; i++) { // 轉(zhuǎn)換漢字 const c = chars[+n[i]]; // 加單位 得到單位 let u = units[n.length - 1 - i] if (c === chars[0]) { u = '' } result += c + u } return _handleZero(result) } }
3. 總結(jié)
最后總結(jié)一波:數(shù)字轉(zhuǎn)換中文的核心就是將數(shù)字進行四位分組,處理邊界零的情況,最后映射轉(zhuǎn)換。
以上就是JavaScript實現(xiàn)將阿拉伯數(shù)字轉(zhuǎn)換成中文大寫的詳細內(nèi)容,更多關(guān)于JavaScript阿拉伯數(shù)字轉(zhuǎn)中文大寫的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
代碼短小的js div層拖動實現(xiàn)代碼[兼容IE與Firefox]
代碼短小的js div層拖動實現(xiàn)代碼[兼容IE與Firefox],需要的朋友可以參考下.2010-05-05Javascript?中?var?和?let?、const?的區(qū)別及使用方法
ECMAScript 變量是松散類型的,意思是變量可以用于保存任何類型的數(shù)據(jù),每個變量只不過是一個用于保存任意值的命名占位符,這篇文章主要介紹了Javascript?中?var?和?let?、const?的區(qū)別以及具體使用效果,需要的朋友可以參考下2023-01-01