当前位置:首页 » 《关注互联网》 » 正文

JavaScript实现将阿拉伯数字转换成中文或大写中文

15 人参与  2024年12月01日 16:01  分类 : 《关注互联网》  评论

点击全文阅读


前言:现在有需求将亿元之内的阿拉伯数字转换成中文,例如: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入门到实战 


点击全文阅读


本文链接:http://www.zhangshiyu.com/post/195012.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 老公把上亿豪宅送养妹后,我把人和房都拆了(顾思思顾言洲)全书免费_(顾思思顾言洲)老公把上亿豪宅送养妹后,我把人和房都拆了后续(顾思思顾言洲)
  • 沈星悦傅时安_沈星悦傅时安
  • 离婚后,居然还能以旧换新?(陈汉李淼淼李思)全书浏览_离婚后,居然还能以旧换新?全书浏览
  • 完结文给女团主播狂刷百万反被骂穷逼,我反手送她队友出道列表_完结文给女团主播狂刷百万反被骂穷逼,我反手送她队友出道(秦薇)
  • 全书浏览老公将我第十个孩子送给情人后,我果断改嫁他绝嗣干爹(苏云遮盛炽)_老公将我第十个孩子送给情人后,我果断改嫁他绝嗣干爹(苏云遮盛炽)全书结局
  • 全文无边怨恨是她活下来的最大动力(江寒静顾榕赫)列表_全文无边怨恨是她活下来的最大动力
  • 全文爸爸死后,消失二十年的妈妈带着儿子回来跟我争家产(顾霆锋顾青卿)列表_全文爸爸死后,消失二十年的妈妈带着儿子回来跟我争家产
  • 霍晚清赵旭然_霍晚清赵旭然
  • 弟弟看的破茧时光沉淀后的深情相拥林悦苏然全书在线
  • 风雨里独自成长全书顾晚妍江知屿在线
  • 爸妈在我房间偷偷安了摄像头(周凝国家不保护废物),爸妈在我房间偷偷安了摄像头
  • 全书浏览雁过雪融向春洲(顾寻煜余芷鸢)_雁过雪融向春洲(顾寻煜余芷鸢)全书结局

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1