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. 需求分析
以下是對這些規(guī)則的分析:
- 數(shù)字分組:
- 單位映射:
- 零的處理:
- 中文數(shù)字映射:
- 轉(zhuǎn)換邏輯:
2.1 數(shù)字分組
- 將數(shù)字從低位到高位,每四位分為一組。例如,
12345678可以分為12, 345, 678。 - 最高位可能不足四位,如
1234,則直接作為一組處理。
先看一個例子:
1234 -> 一千二百三十四
12340000 -> 一千二百三十四
規(guī)則:
- 當(dāng)是四位以內(nèi)時,則是千百十表示
- 超過四位時,則是將前幾位按照
規(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ù)的每一位(個、十、百、千),我們有對應(yīng)的單位:
''(無單位,即個位)、十、百、千。 - 對于更高位的組(萬、億等),我們也有對應(yīng)的單位:
萬、億等。
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
}
// 處理重復(fù)零,末尾零情況
return _handleZero(result)
}
2.3 循環(huán)分割數(shù)組,添加單位
現(xiàn)在將四位進(jìn)行分割的數(shù)組,循環(huán)遍歷,添加大的單位。
- 從低位到高位遍歷數(shù)字的每一位。
- 對于每一位,根據(jù)其在組中的位置(個、十、百、千)和組在整體數(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)換
- 需要一個映射表,將阿拉伯?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)文章
JavaScript實(shí)現(xiàn)左右滾動電影畫布
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)左右滾動電影畫布,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02
二級域名或跨域共享Cookies的實(shí)現(xiàn)方法
適用于Asp。 在主域名設(shè)置的Cookie,在各子域名共用;適用于博客等提供二級域名。這個問題,以網(wǎng)上有眾多帖子,可惜都沒有完整解決。2008-08-08
javascript下拉框選項(xiàng)單擊事件的例子分享
這篇文章主要分享了一些javascript下拉框選項(xiàng)單擊事件的例子,以及在例子中遇到的問題的解決方法,十分實(shí)用,推薦給小伙伴們參考下。2015-03-03
原生js+cookie實(shí)現(xiàn)購物車功能的方法分析
這篇文章主要介紹了原生js+cookie實(shí)現(xiàn)購物車功能的方法,結(jié)合實(shí)例形式分析了javascript結(jié)合cookie存儲實(shí)現(xiàn)購物車功能的相關(guān)操作技巧,需要的朋友可以參考下2017-12-12
JavaScript中數(shù)組sort()方法的基本使用與踩坑記錄
: js中用方法sort()為數(shù)組排序,這篇文章主要給大家介紹了關(guān)于JavaScript中數(shù)組sort()方法的基本使用,sort()方法已經(jīng)可以滿足我們對數(shù)組的很多處理需求,需要的朋友可以參考下2021-06-06
通過循環(huán)優(yōu)化 JavaScript 程序
這篇文章主要介紹了通過循環(huán)優(yōu)化 JavaScript 程序,對于提高 JavaScript 程序的性能這個問題,最簡單同時也是很容易被忽視的方法就是學(xué)習(xí)如何正確編寫高性能循環(huán)語句。下面我們來學(xué)習(xí)一下吧2019-06-06
javascript數(shù)據(jù)類型中的一些小知識點(diǎn)(推薦)
這篇文章主要介紹了javascript數(shù)據(jù)類型中的一些小知識點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

