数字转中文

实现阿拉伯数字转中文数字的方法

问题

将阿拉伯数字转换为中文数字表示,例如 123 转换为”一百二十三”。

解答

function NoToChinese(num) {
    // 验证输入是否为数字
    if (!/^\d*(\.\d*)?$/.test(num)) {
        alert("Number is wrong!");
        return "Number is wrong!";
    }
    
    var AA = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九");
    var BB = new Array("", "十", "百", "千", "万", "亿", "点", "");
    
    // 去除前导零并按小数点分割
    var a = ("" + num).replace(/(^0*)/g, "").split(".");
    var k = 0;
    var re = "";
    
    // 处理整数部分
    for (var i = a[0].length - 1; i >= 0; i--) {
        switch (k) {
            case 0:
                re = BB[7] + re;
                break;
            case 4:
                if (!new RegExp("0{4}\\d{" + (a[0].length - i - 1) + "}$").test(a[0]))
                    re = BB[4] + re;
                break;
            case 8:
                re = BB[5] + re;
                BB[7] = BB[5];
                k = 0;
                break;
        }
        if (k % 4 == 2 && num.charAt(i + 2) != 0 && num.charAt(i + 1) == 0)
            re = AA[0] + re;
        if (num.charAt(i) != 0)
            re = AA[num.charAt(i)] + BB[k % 4] + re;
        k++;
    }
    
    // 处理小数部分
    if (a.length > 1) {
        re += BB[6];
        for (var i = 0; i < a[1].length; i++)
            re += AA[a[1].charAt(i)];
    }
    
    return re;
}

关键点

  • 使用正则表达式验证输入是否为合法数字格式
  • 通过数组映射实现数字到中文的转换,AA 存储基本数字,BB 存储单位
  • 从个位开始逆序遍历,根据位数(个十百千万亿)添加对应单位
  • 处理连续零的情况,避免出现”一千零零一”这样的错误
  • 小数部分直接逐位转换,用”点”连接