JavaScript實(shí)現(xiàn)將阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文大寫
1. 背景
現(xiàn)在有需求將億元之內(nèi)的阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文,例如:1234
轉(zhuǎn)換后變?yōu)?code>一千二百三十四再轉(zhuǎn)換成壹仟貳佰叁拾肆
。
2. 需求分析
以下是對(duì)這些規(guī)則的分析:
- 數(shù)字分組:
- 單位映射:
- 零的處理:
- 中文數(shù)字映射:
- 轉(zhuǎn)換邏輯:
2.1 數(shù)字分組
- 將數(shù)字從低位到高位,每四位分為一組。例如,
12345678
可以分為12, 345, 678
。 - 最高位可能不足四位,如
1234
,則直接作為一組處理。
先看一個(gè)例子:
1234 -> 一千二百三十四
12340000 -> 一千二百三十四
規(guī)則:
- 當(dāng)是四位以內(nèi)時(shí),則是千百十表示
- 超過(guò)四位時(shí),則是將前幾位按照
規(guī)則1
表示,后面加上萬(wàn)的單位
通過(guò)上述可以得到,將轉(zhuǎn)換的數(shù)字先進(jìn)行四位拆分。
function numToWords(num) { // 四位進(jìn)行分割 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ù)組,每項(xiàng)轉(zhuǎn)換,對(duì)四位進(jìn)行處理。每一位對(duì)應(yīng)的單位不同,轉(zhuǎn)換后再進(jìn)行拼接即可。
接下來(lái)處理四位轉(zhuǎn)換:
- 對(duì)于每一組數(shù)字,我們需要將其轉(zhuǎn)換為對(duì)應(yīng)的中文數(shù)字,并添加相應(yīng)的單位。
- 對(duì)于四位數(shù)的每一位(個(gè)、十、百、千),我們有對(duì)應(yīng)的單位:
''
(無(wú)單位,即個(gè)位)、十
、百
、千
。 - 對(duì)于更高位的組(萬(wàn)、億等),我們也有對(duì)應(yīng)的單位:
萬(wàn)
、億
等。
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 -> 一千二百三十四
問(wèn)題1: 如果是1203,得到一千二百零十三 - 需要處理如果是0 則不需要帶單位
問(wèn)題2: 如果1003,得到一千零零三
- 則需要將連續(xù)的零保留一個(gè)
問(wèn)題3: 如果1200 得到一千二百零零 - 需要去除末尾的零
問(wèn)題4: 如果100001000 得到一億零零零零萬(wàn)一千零零零 - 如果四位都是零則保留一個(gè)
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 } // 處理重復(fù)零,末尾零情況 return _handleZero(result) }
2.3 循環(huán)分割數(shù)組,添加單位
現(xiàn)在將四位進(jìn)行分割的數(shù)組,循環(huán)遍歷,添加大的單位。
- 從低位到高位遍歷數(shù)字的每一位。
- 對(duì)于每一位,根據(jù)其在組中的位置(個(gè)、十、百、千)和組在整體數(shù)字中的位置(無(wú)單位、萬(wàn)、億等),選擇正確的單位和中文數(shù)字進(jìn)行拼接。
- 處理邊界情況
function numToWords(num) { // 四位進(jìn)行分割 const numStr = num.toString().replace(/(?=(\d{4})+$)/g, ',') .split(',') .filter(Boolean) const bigUnits = ["", "萬(wàn)", "億"]; 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]; // 也是需要考慮當(dāng)四位為0的情況不需要添加單位 if (c === chars[0]) { u = '' } result += c + u } result = _handleZero(result) return result }
至此轉(zhuǎn)換成中文就結(jié)束。
2.4 大寫轉(zhuǎn)換
- 需要一個(gè)映射表,將阿拉伯?dāng)?shù)字
0-9
映射到對(duì)應(yīng)的中文數(shù)字零-九
以及大寫形式壹-玖
。
const map = { 零: '零', 一: '壹', 二: '貳', 三: '叁', 四: '肆', 五: '伍', 六: '陸', 七: '柒', 八: '捌', 九: '玖', 十: '拾', 百: '佰', 千: '仟', 萬(wàn): '萬(wàn)', 億: '億', } // 最后結(jié)果轉(zhuǎn)換下即可 result.split('').map(s => map[s]).join('')
附上完整代碼:
function numToWords(num) { const map = { 零: '睿', 一: '壹', 二: '貳', 三: '叁', 四: '肆', 五: '伍', 六: '陸', 七: '柒', 八: '捌', 九: '玖', 十: '拾', 百: '佰', 千: '仟', 萬(wàn): '萬(wàn)', 億: '億', } const bigUnits = ["", "萬(wàn)", "億"]; const chars = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"]; const units = ["", "十", "百", "千"]; // 四位進(jìn)行分割 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ù)字進(jìn)行四位分組,處理邊界零的情況,最后映射轉(zhuǎn)換。
以上就是JavaScript實(shí)現(xiàn)將阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文大寫的詳細(xì)內(nèi)容,更多關(guān)于JavaScript阿拉伯?dāng)?shù)字轉(zhuǎn)中文大寫的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
比較全面的event對(duì)像在IE與FF中的區(qū)別 推薦
整理的比較全的event對(duì)像在ie與firefox瀏覽器中的區(qū)別。2009-09-09JavaScript實(shí)現(xiàn)文本中間縮略的兩種方案
項(xiàng)目中經(jīng)常會(huì)遇到縮略展示文字的場(chǎng)景,即要求文字在一行不換行展示,超出自動(dòng)展示...,常用的展示效果有兩種,文字中間縮略以及文字末尾縮略,本文將通過(guò)代碼示例給大家詳細(xì)的講一下這兩種方案,需要的朋友可以參考下2024-06-06JS設(shè)置緩存和緩存過(guò)期時(shí)間的操作方法
js-cookie是一個(gè)用于處理瀏覽器Cookie的JavaScript庫(kù),本文通過(guò)實(shí)例代碼講解JS設(shè)置緩存和緩存過(guò)期時(shí)間的操作方法,感興趣的朋友跟隨小編一起看看吧2025-01-01CSS或者JS實(shí)現(xiàn)鼠標(biāo)懸停顯示另一元素
這篇文章主要介紹了CSS或者JS實(shí)現(xiàn)鼠標(biāo)懸停顯示另一元素的相關(guān)資料,需要的朋友可以參考下2016-01-01代碼短小的js div層拖動(dòng)實(shí)現(xiàn)代碼[兼容IE與Firefox]
代碼短小的js div層拖動(dòng)實(shí)現(xiàn)代碼[兼容IE與Firefox],需要的朋友可以參考下.2010-05-05Javascript?中?var?和?let?、const?的區(qū)別及使用方法
ECMAScript 變量是松散類型的,意思是變量可以用于保存任何類型的數(shù)據(jù),每個(gè)變量只不過(guò)是一個(gè)用于保存任意值的命名占位符,這篇文章主要介紹了Javascript?中?var?和?let?、const?的區(qū)別以及具體使用效果,需要的朋友可以參考下2023-01-01