JavaScript实现阿拉伯数字转中文及大写金额的方法

作者:百宝袋

时间:2026-10-31

浏览:225

本文详解在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 处理四位转换

遍历拆分后的数组,对每一项执行四位数的转换逻辑,最后拼接结果。

接下来具体处理四位数的转换逻辑:

  • 对于每一组数字,需将其转换为对应的中文数字字符,并添加相应的位值单位。
  • 针对四位数中的每一位(个、十、百、千),存在对应的单位映射:''(代表个位,无显式单位)、十、百、千。
  • 对于更高位值的组(如万、亿等),同样存在对应的单位映射:万、亿等。

转换结果示例:

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阿拉伯数字转中文的资料请关注本站其它相关文章!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章