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)換,對四位進行處理。每一位對應(yīng)的單位不同,轉(zhuǎ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)在將四位進行分割的數(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映射到對應(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 = ["", "十", "百", "千"];
// 四位進行分割
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)文章
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ù)類型中的一些小知識點(推薦)
這篇文章主要介紹了javascript數(shù)據(jù)類型中的一些小知識點,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

