整体思路差不多 写法更规范 替代用的是正则匹配
function numberToChinese(num) {
const CN_SYMBOL = '';
const CN_ZERO = '零';
const CN_ONE = '壹';
const CN_TWO = '贰';
const CN_THREE = '叁';
const CN_FOUR = '肆';
const CN_FIVE = '伍';
const CN_SIX = '陆';
const CN_SEVEN = '柒';
const CN_EIGHT = '捌';
const CN_NINE = '玖';
const CN_TEN = '拾';
const CN_HUNDRED = '佰';
const CN_THOUSAND = '仟';
const CN_TEN_THOUSAND = '万';
const CN_HUNDRED_MILLION = '亿';
const CN_SYMBOL_MONEY = '元';
const CN_SYMBOL_DOT = '点';
const CN_SYMBOL_FULL = '整';
const CN_SYMBOL_FEN = '分';
const CN_SYMBOL_JIAO = '角';
const CN_NUMBERS = [CN_ZERO, CN_ONE, CN_TWO, CN_THREE, CN_FOUR, CN_FIVE, CN_SIX, CN_SEVEN, CN_EIGHT, CN_NINE];//数字的大写
const CN_UNITS = ['', CN_TEN, CN_HUNDRED, CN_THOUSAND, CN_TEN_THOUSAND, CN_HUNDRED_MILLION];//量级大写 ‘’,拾,佰,仟,万,亿
let integer, decimal, output;
[integer, decimal = ''] = String(num).split('.');//整数部分,小数部分
integer = integer.split('').reverse().join('');//整数部分 先转数组 然后倒过来 然后转字符串
if (Number(num) === 0) {//数字是零→零元整
output = CN_ZERO + CN_SYMBOL_MONEY + CN_SYMBOL_FULL;
} else {
output = '';
for (let i = 0; i < integer.length; i++) {
//处理整数部分 数字大写[]+量级(为零?无量级:量级)+ 之前的
output = CN_NUMBERS[integer[i]] + (integer[i] === '0' ? '' : CN_UNITS[i % 4]) + output;
if (i % 4 === 3) {//如果当前数字所在的位置是整数部分的末尾或某个量级的末尾,则需要添加下一个量级,具体来说,就是将当前量级加 4 后得到下一个量级,并将其添加到输出字符串中
output = CN_UNITS[Math.floor(i / 4) + 4] + output;
}
}
output = output.replace(/零(?=零+|$|万|亿)/g, '');// /零(?=零+|$|万|亿)/g: 匹配所有的“零”,但仅在后面没有其他“零”或者字符串结尾、或者紧接着是“万”或“亿”的情况下才进行替换。
output = output.replace(/亿(?=万)/g, '亿');// /亿(?=万)/g: 匹配所有的“亿”,但仅在后面紧接着是“万”的情况下才进行替换。
output = output.replace(/零+万/g, '万');// /零+万/g: 匹配所有的“零万”,将其替换为“万”。
output = output.replace(/零+元/g, '元');// /零+元/g: 匹配所有的“零元”,将其替换为“元”。
output = output.replace(/亿万/g, '亿');// /亿万/g: 匹配所有的“亿万”,将其替换为“亿”。
if (decimal) {//小数部分处理 数字+角/分
output += (CN_NUMBERS[decimal[0]] || '') + (decimal[0] === '0' ? '' : CN_SYMBOL_JIAO);
output += (CN_NUMBERS[decimal[1]] || '') + (decimal[1] === '0' ? '' : CN_SYMBOL_FEN);
} else {
output += CN_SYMBOL_FULL;//整
}
}
return CN_SYMBOL + output;
}
console.log(numberToChinese(123456789.12)); // 输出: "壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元壹角贰分"
复习点
一、reverse
1、定义和用法
reverse()
方法用于颠倒数组中元素的顺序。
2、语法
array.reverse()
3、返回值
Array:
颠倒顺序后的数组
二、replace
1、定义和用法
replace()
方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
2、语法
string.replace(searchvalue,newvalue)
- searchvalue:必须。规定子字符串或要替换的模式的 RegExp 对象。
请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。
- newvalue:必需。一个字符串值。规定了替换文本或生成替换文本的函数。
3、返回值
- String:一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。