免费资源网 – https://freexyz.cn/

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

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

    接下来处理四位转换:

    • 对于每一组数字,我们需要将其转换为对应的中文数字,并添加相应的单位。
    • 对于四位数的每一位(个、十、百、千),我们有对应的单位:''(无单位,即个位)、
    • 对于更高位的组(万、亿等),我们也有对应的单位:亿等。
    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阿拉伯数字转中文大写的资料请关注其它相关文章!

    免费资源网 – https://freexyz.cn/

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。