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

 更新时间:2024年05月07日 11:07:30   作者:一诺滚雪球  
现在有需求将亿元之内的阿拉伯数字转换成中文,例如:1234转换后变为一千二百三十四再转换成壹仟贰佰叁拾肆,所以本文给大家介绍了用JavaScript实现将阿拉伯数字转换成中文大写,感兴趣的小伙伴跟着小编一起来看看吧

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 处理四位转换

循环拆分后的数组,每项转换,对四位进行处理。每一位对应的单位不同,转换后再进行拼接即可。

接下来处理四位转换:

  • 对于每一组数字,我们需要将其转换为对应的中文数字,并添加相应的单位。
  • 对于四位数的每一位(个、十、百、千),我们有对应的单位:''(无单位,即个位)、
  • 对于更高位的组(万、亿等),我们也有对应的单位:亿等。
const chars = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
const units = ["", "十", "百", "千"];
function _transform(n) {
    let result = ''
    for (let i = 0; i < n.length; i++) {
        // 转换汉字
        const c = chars[+n[i]];
        // 加单位 得到单位
        let u = units[n.length - 1 - i]
        result += c + u
    }
    return result
}

得到结果:

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实现将阿拉伯数字转换成中文大写的详细内容,更多关于JavaScript阿拉伯数字转中文大写的资料请关注脚本之家其它相关文章!

相关文章

  • js判断生效时间不得大于失效时间的思路及代码

    js判断生效时间不得大于失效时间的思路及代码

    生效时间不得大于失效时间在一些推销、优惠方面还是比较实用的,接下来一起看下详细的实现代码,感兴趣的朋友可以参考下哈,希望对你有所帮助
    2013-04-04
  • TypeScript Typeof运算符的5个实用技巧详解

    TypeScript Typeof运算符的5个实用技巧详解

    这篇文章主要为大家介绍了TypeScript Typeof运算符的5个实用技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Django1.7+JQuery+Ajax验证用户注册集成小例子

    Django1.7+JQuery+Ajax验证用户注册集成小例子

    下面是散仙使用Django+Jquery+Ajax的方式来模拟实现了一个验证用户注册时,用户名存在不存在的一个小应用。注意,验证存在不存在使用的是Ajax的方式,不用让用户点击按钮验证是否存在,需要的朋友可以参考下
    2017-04-04
  • javascript trim 去空格函数实现代码

    javascript trim 去空格函数实现代码

    去除字符串左右两端的空格,在vbscript里面可以轻松地使用 trim、ltrim 或 rtrim,但在js中却没有这3个内置方法,需要手工编写。下面的实现方法是用到了正则表达式,效率不错,并把这三个方法加入String对象的内置方法中去。
    2008-10-10
  • 基于JavaScript概括浏览器方向的优化

    基于JavaScript概括浏览器方向的优化

    这篇文章主要介绍了JavaScript浏览器方向的优化,文章围绕主题展开详细的内容介绍具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • javascript使用Promise对象实现异步编程

    javascript使用Promise对象实现异步编程

    这篇文章主要介绍了javascript使用Promise对象实现异步编程的相关资料,需要的朋友可以参考下
    2016-03-03
  • JavaScript将一个数组插入到另一个数组的方法

    JavaScript将一个数组插入到另一个数组的方法

    这篇文章主要介绍了JavaScript将一个数组插入到另一个数组的方法,涉及javascript中Array.prototype.push.apply方法的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • js设计模式之结构型享元模式详解

    js设计模式之结构型享元模式详解

    这篇文章主要为大家详细介绍了js设计模式之结构型享元模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • 使用Xcache缓存器加速PHP网站的配置方法

    使用Xcache缓存器加速PHP网站的配置方法

    从访问速度上来看,一般要比放于国内的网站慢2-3倍,所以便想办法对网站做了一些简单的优化,比如使用缓存系统来提升网站页面访问速度
    2017-04-04
  • js实现字符全排列算法的简单方法

    js实现字符全排列算法的简单方法

    下面小编就为大家带来一篇js实现字符全排列算法的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05

最新评论