代码如下
function getChinese(n){ // 判断参数是否为 0 或 0以上的 一个数字 if (!/^(0|[1-9]\d*)$/.test(n)) return "这不是一个正确的数字"; // 参数转字符串 n += "" // unit 数字的单位 num数字的大写汉字 str 存放处理后的字符串 var unit = "个拾佰仟万拾佰仟亿拾佰仟",num="零壹贰叁肆伍陆柒捌玖",str = ""; // 判断数字位数不能超出 unit 的长度 if(n.length>unit.length) return `不能超过${unit.length}位` // n[i]数字的每一项 num的下标对应数字0-9 所以num[n[i]]可以取到数字对应的大写汉字 // 因为数字n是从右到左依次为 个位、十位... 而 unit 顺序正好相反 所以用unit[n.length-1-i]取到对应的单位。 for (var i=0;i<n.length;i++) str += num[n[i]] + unit[n.length-1-i]; // $1,$2... 表示 匹配结果中对应分组匹配的结果 // 如果 n 存在 0 那么str会出现 零(千|百|拾|个) 这种情况。所以用下面的方法替换。 // replace(/零(千|百|拾|个)/g,"零") // 如果 n 存在多个 0 咱们只需要一个 0 所以用下面方法替换 // replace(/(零)+/g,"零") // 如果 存在 零(万|亿),即万位、亿位为0,我们只需要 (万|亿) // replace(/零(万|亿)/g, "$1") // 如果 n 包含 10 我们只需要 拾 // replace(/壹(拾)/g, "$1$2") // 结尾去掉 零|个 // replace(/(零|个)$/g,"") return str.replace(/零(仟|佰|拾|个)/g,"零").replace(/(零)+/g,"零").replace(/零(万|亿)/g, "$1").replace(/(亿)万|壹(拾)/g, "$1$2").replace(/(零|个)$/g,"");}