前言:现在有需求将亿元之内的阿拉伯数字转换成中文,例如:1234转换后变为一千二百三十四再转换成壹仟贰佰叁拾肆,所以本文给大家介绍了用JavaScript实现将阿拉伯数字转换成中文大写,感兴趣的小伙伴跟着小编一起来看看吧~ ?
??文章目录
1. 背景
2. 需求分析
2.1 数字分组
2.2 处理四位转换
2.3 循环分割数组,添加单位
2.4 大写转换
附上完整代码:
3. 总结
1. 背景
现在有需求将亿元之内的阿拉伯数字转换成中文,例如:1234
转换后变为一千二百三十四
再转换成壹仟贰佰叁拾肆
。
2. 需求分析
以下是对这些规则的分析:
数字分组:单位映射:零的处理:中文数字映射:转换逻辑:2.1 数字分组
将数字从低位到高位,每四位分为一组。例如,12345678
可以分为 12, 345, 678
。最高位可能不足四位,如 1234
,则直接作为一组处理。 先看一个例子:
1234 -> 一千二百三十四
12340000 -> 一千二百三十四
规则:
当是四位以内时,则是千百十表示超过四位时,则是将前几位按照规则1
表示,后面加上万的单位 通过上述可以得到,将转换的数字先进行四位拆分。
function numToWords(num) { // 四位进行分割 const numStr = num.toString().replace(/(?=(\d{4})+$)/g, ',') .split(',') .filter(Boolean)}
拆分情况:
123456 -> ,12,3456 -> ['',12,3456] -> [12,3456]
2.2 处理四位转换
循环拆分后的数组,每项转换,对四位进行处理。每一位对应的单位不同,转换后再进行拼接即可。
接下来处理四位转换:
对于每一组数字,我们需要将其转换为对应的中文数字,并添加相应的单位。对于四位数的每一位(个、十、百、千),我们有对应的单位:''
(无单位,即个位)、十
、百
、千
。对于更高位的组(万、亿等),我们也有对应的单位:万
、亿
等。 得到结果:
1234 -> 一千二百三十四
问题1: 如果是1203,得到一千二百零十三 - 需要处理如果是0 则不需要带单位
问题2: 如果1003,得到一千零零三
则需要将连续的零保留一个问题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++) { // 转换汉字 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 循环分割数组,添加单位
现在将四位进行分割的数组,循环遍历,添加大的单位。
从低位到高位遍历数字的每一位。对于每一位,根据其在组中的位置(个、十、百、千)和组在整体数字中的位置(无单位、万、亿等),选择正确的单位和中文数字进行拼接。处理边界情况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}
至此转换成中文就结束。
2.4 大写转换
需要一个映射表,将阿拉伯数字0-9
映射到对应的中文数字 零-九
以及大写形式 壹-玖
。 const map = { 零: '零', 一: '壹', 二: '贰', 三: '叁', 四: '肆', 五: '伍', 六: '陆', 七: '柒', 八: '捌', 九: '玖', 十: '拾', 百: '佰', 千: '仟', 万: '萬', 亿: '亿',}// 最后结果转换下即可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++) { // 转换汉字 const c = chars[+n[i]]; // 加单位 得到单位 let u = units[n.length - 1 - i] if (c === chars[0]) { u = '' } result += c + u } return _handleZero(result) }}
3. 总结
最后总结一波:数字转换中文的核心就是将数字进行四位分组,处理边界零的情况,最后映射转换。
到此这篇文章就介绍到这了,更多精彩内容请关注本人以前的文章或继续浏览下面的文章,创作不易,如果能帮助到大家,希望大家点点收藏+关注~?
更多专栏订阅推荐:
? JavaScript深入研究
? 前端工程搭建
? vue从基础到起飞
✈️ HTML5与CSS3
?️ JavaScript基础
⭐️ uniapp与微信小程序
? 前端工作常见问题与避坑指南
✍️ GIS地图与大数据可视化
? 常用组件库与实用工具
? java入门到实战