HOOOS

js 数字金额转中文人民币字符串的方法

1 1106 小祺先生 JavaScript金额转换编程
Apple

通过 JavaScript 把数字的金额比如 12345 转成 中文的金额 一万二千三百四十五元 ,要实现起来非常简单,其他的语言也是相同的道理,思路是一样的。

思路

  1. 获取长度,得到对应单位
  2. 截取第一个字符,得到中文的数字
  3. 循环以上操作

代码示例

为了方便,封装成一个函数

function money_number_to_chinese (num){
    // 中文与数字对应数组
    let chinese = ['零','一','二','三','四','五','六','七','八','九'];

    // 长度与单位对应数组
    let units = ['','十','百','千','万','十','百','千','亿','十','百','千','兆','十','百','千','万'];

    // 结果字符串变量
    let money = '';

    // 把参数转成字符串操作
    num = num + '';

    // 循环开始
    // 循环条件为 数字长度 大于0
    while (num.length > 0){
        // 拼接 中文数字 与 单位
        money += chinese[num.slice(0,1)] + units[num.length - 1];

        // 去掉已经计算过第一个的数字
        num = num.slice(1);
    }

    // 返回金额
    return money + '元';
}

测试:

money_number_to_chinese(123456)
// 一万二千三百四十五元

但是遇到后面是零的,会出现 零十 零百 这样的情况,所以还可以继续优化

优化 (零十 零百 零万 .. 情况)

思路是判断后面数字都是0的情况,做不输出的操作。
但是万、亿、兆是重要单位不能被忽略

function money_number_to_chinese (num){
    if (!num){
        return '零元';
    }
    let chinese = ['零','一','二','三','四','五','六','七','八','九'];
    let units = ['','十','百','千','万','十','百','千','亿','十','百','千','兆','十','百','千','万'];
    let money = '';
    num = num + '';
    while (num.length > 0){

        // 如果数字 不等于 0 继续转换数字和单位
        if (num != 0){
            money += chinese[num.slice(0,1)] + units[num.length - 1];
        }

        // 如果数字等于0 并且 是 万 亿 兆 这样的重要单位 就 保留 单位 num为空 结束循环
        if (num == 0 && (num.length == 4 || num.length == 9 || num.length == 13)){
            money += units[num.length - 2];
            num = '';
        }else{
            // 否则 去掉计算过的数字 继续循环
            num = num.slice(1);
        }
    }
    return money + '元';
}

测试:

money_number_to_chinese(123000000000);
// 一千二百三十亿

还有一些细节可以自行完善,这个代码最多只支持 万兆 可以做判断限制,或者结合自己的程序需要做一些处理。

还有一个细节是 在js中,字符串 "000" == 0 ,在其他语言中可能不一样,只需要做另外处理就行,主要判断是否后面都是0,也可以用正则做判断。


原创内容,不要转载,欢迎评论区互动。

点评评价

captcha
  • 小祺先生

    参数 可以是 字符串 或者 数字,但是最终都会转成字符串处理,因为JS字符串截取的内置函数毕竟多,如果在前端用兼容性也好。

    另外,如果有小数点,可以把小数点后面的数字单独截取出来,分开处理,在返回结果之前,在处理一下小数点。

    如果有参数有逗号,把全部逗号过滤掉就行。

    // 过滤不是数字的为空 比如:123,400
    num = (num + '').replace(/[^\\d]+/g,'');
    
    // 超出转换单位范围
    if (num.length > units.length){
    return '';
    }
    
健康