JavaScript實(shí)現(xiàn)將阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文或大寫中文的方法
1. 背景
現(xiàn)在有需求將億元之內(nèi)的阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文,例如:1234轉(zhuǎn)換后變?yōu)橐磺Ф偃脑俎D(zhuǎn)換成壹仟貳佰叁拾肆。
2. 需求分析
以下是對這些規(guī)則的分析:
- 數(shù)字分組:
- 單位映射:
- 零的處理:
- 中文數(shù)字映射:
- 轉(zhuǎn)換邏輯:
2.1 數(shù)字分組
- 將數(shù)字從低位到高位,每四位分為一組。例如,
12345678
可以分為12, 345, 678
。 - 最高位可能不足四位,如
1234
,則直接作為一組處理。
先看一個(gè)例子:
1234 -> 一千二百三十四
12340000 -> 一千二百三十四
規(guī)則:
- 當(dāng)是四位以內(nèi)時(shí),則是千百十表示
- 超過四位時(shí),則是將前幾位按照
規(guī)則1
表示,后面加上萬的單位
通過上述可以得到,將轉(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)換,對四位進(jìn)行處理。每一位對應(yīng)的單位不同,轉(zhuǎn)換后再進(jìn)行拼接即可。
接下來處理四位轉(zhuǎn)換:
- 對于每一組數(shù)字,我們需要將其轉(zhuǎn)換為對應(yīng)的中文數(shù)字,并添加相應(yīng)的單位。
- 對于四位數(shù)的每一位(個(gè)、十、百、千),我們有對應(yīng)的單位:
''
(無單位,即個(gè)位)、十
、百
、千
。- 對于更高位的組(萬、億等),我們也有對應(yīng)的單位:
萬
、億
等。
得到結(jié)果:
1234 -> 一千二百三十四
問題1: 如果是1203,得到一千二百零十三 - 需要處理如果是0 則不需要帶單位
問題2: 如果1003,得到一千零零三
- 則需要將連續(xù)的零保留一個(gè)
問題3: 如果1200 得到一千二百零零 - 需要去除末尾的零
問題4: 如果100001000 得到一億零零零零萬一千零零零 - 如果四位都是零則保留一個(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ù)字的每一位。
- 對于每一位,根據(jù)其在組中的位置(個(gè)、十、百、千)和組在整體數(shù)字中的位置(無單位、萬、億等),選擇正確的單位和中文數(shù)字進(jìn)行拼接。
- 處理邊界情況
function numToWords(num) { // 四位進(jìn)行分割 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]; // 也是需要考慮當(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
映射到對應(yīng)的中文數(shù)字零-九
以及大寫形式壹-玖
。
const map = { 零: '零', 一: '壹', 二: '貳', 三: '叁', 四: '肆', 五: '伍', 六: '陸', 七: '柒', 八: '捌', 九: '玖', 十: '拾', 百: '佰', 千: '仟', 萬: '萬', 億: '億', } // 最后結(jié)果轉(zhuǎn)換下即可 result.split('').map(s => map[s]).join('')
附上完整代碼:
function numToWords(num) { const map = { 零: '睿', 一: '壹', 二: '貳', 三: '叁', 四: '肆', 五: '伍', 六: '陸', 七: '柒', 八: '捌', 九: '玖', 十: '拾', 百: '佰', 千: '仟', 萬: '萬', 億: '億', } const bigUnits = ["", "萬", "億"]; 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)中文的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JS實(shí)現(xiàn)上傳圖片的三種方法并實(shí)現(xiàn)預(yù)覽圖片功能
在用戶注冊頁面,需要用戶在本地選擇一張圖片作為頭像,并同時(shí)預(yù)覽,實(shí)現(xiàn)思路有兩種,具體實(shí)現(xiàn)方法和實(shí)例代碼大家參考下本文2017-07-07JavaScript編程設(shè)計(jì)模式之觀察者模式(Observer Pattern)實(shí)例詳解
這篇文章主要介紹了JavaScript編程設(shè)計(jì)模式之觀察者模式(Observer Pattern),簡單說明了觀察者模式的概念、原理并結(jié)合實(shí)例形式詳細(xì)給出了觀察者模式的相關(guān)實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2017-10-10JavaScript中不可忽略的Symbol的盤點(diǎn)
Symbol類型的出現(xiàn),為每個(gè)屬性賦予了獨(dú)一無二的標(biāo)識符,無論項(xiàng)目多么復(fù)雜,Symbol都能確保屬性鍵的絕對唯一性,下面我們就來看看JavaScript中那些不可忽略的Symbol吧2024-12-12一種基于瀏覽器的自動(dòng)小票機(jī)打印實(shí)現(xiàn)方案(js版)
這篇文章主要介紹了一種基于瀏覽器的自動(dòng)小票機(jī)打印實(shí)現(xiàn)方案(js版)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07JavaScript實(shí)現(xiàn)圖片瀑布流和底部刷新
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)圖片瀑布流和底部刷新,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01js獲取URL的參數(shù)的方法(getQueryString)示例
getQueryString方法默認(rèn)返回的是 string如果是int類型,則JS使用的時(shí)候,要進(jìn)行轉(zhuǎn)換一下,下面有個(gè)不錯(cuò)的示例,大家可以參考下2013-09-09