将金额数字转换成汉字
需求:输入数字,将数字转换成汉字
注意:只支持到十亿,小数点只支持两位数
思路
- 将数字转换成汉字
- 根据其数位添加其计数单位
- 判断0在不同位置的读法
- 个位:不转汉字,加计数单位
- 十位:转汉字,不加计数单位
- 百位:转汉字,不加计数单位
- 千位:转汉字,不加计数单位
- 万位:不转汉字,加计数单位
- 十万位:转汉字,不加计数单位
- 百万位:转汉字,不加计数单位
- 千万位:转汉字,不加计数单位
- 亿位:不转汉字,加计数单位
- 十亿位:转汉字,不加计数单位
- 去掉多余的汉字
- 去掉重复的零
- 去掉后面是计数单位的零
- 去掉结尾的零
- 判断重复的计数单位(只有零在万位时会出现此情况)
方法中变量
- @unitList: 计数单位
- @textList:数字对应的汉字
- @numArray: 数字的小数和整数分开成数组
- @integerArray: 整数部分
- @numText: 转换结果
- @numTextArr: 汉字格式的数组
代码
function transitText(number) {
if (number === 0) {
return "零元";
}
//定义数据
let unitList = ['', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾'];
let textList = { 0: "零", 1: "壹", 2: "贰", 3: "叁", 4: "肆", 5: "伍", 6: "陆", 7: "柒", 8: "捌", 9: "玖", };
let numArray = (number + "").split(".");
let integerArray = numArray[0].split("");
let numText = "";
//遍历进行汉字转换和添加计数单位
integerArray.forEach((item, i) => {
let indexLength = integerArray.length - 1 - i; //当前数字的数位
if (item == 0) { //判断为0的情况
numText += [0,4,8].includes(indexLength) ? unitList[indexLength] : textList[item];
} else {
numText += textList[item] + unitList[indexLength];
}
});
/*去掉多余的汉字*/
var numTextArr = numText.split("");
for (let i = 0; i < numTextArr.length; i++) {
//去掉重复的零和后面是计数单位的零
if (numTextArr[i] == "零" && (numTextArr[i + 1] == "零" || unitList.indexOf(numTextArr[i + 1]) != -1)) {
numTextArr.splice(i, 1);
i--;
}
//判断计数单位是否重复
if (unitList.indexOf(numTextArr[i]) == 4 && unitList.indexOf(numTextArr[i - 1]) >= 8) {
numTextArr.splice(i, 1);
i--;
}
}
numText = numTextArr.join("");
//去掉末尾的零
if (numText[numText.length - 1] == "零") {
numText = numText.slice(0, numText.length - 1);
}
//判断是否需要有小数位
if (numArray.length == 1) {
return numText + "元整";
} else {
let decimal = numArray[1].split(""); //小数部分
if (decimal[0] == 0 && decimal[1] == 0) {
return numText + "元整";
} else {
numText += "元";
for (let i = 0; i < decimal.length; i++) {
if (i == 1 && decimal[i] == 0) {
break;
}
numText += textList[decimal[i]];
numText += i == 0 ? "角" : "分";
}
return numText;
}
}
}
方法内容上没有进行优化,可以考虑能否进一步优化,支持金额长度上可以自己延长

浙公网安备 33010602011771号