嗯,今天成功了的被上了一课,就是很气特别气嗯,就是这样,有一些东西自己知道但是还是会生气。
问题:
就是一个很正常的功能,会计大小写数字转换,然后有一个神器的数字
叫做108900,
网上随便找的图片,问题是我们这边显示的壹拾万捌仟玖佰元整
,我几乎查了全网的会计大小写转换都是这个样子的,壹拾万捌仟玖佰元整
,但是呢很不巧我们项目旁白的项目显示的壹拾万零捌仟玖佰元
,然后呢我们的甲方爸爸说要改成加零的,然后我先去看了我们的代码,确实牛皮,硬生生手写,我是真的服,然后看看修改直接吐了,然后叫我们的前段小姐姐看了之后说挺麻烦的,然后我们去网上搜,然后发现了真是的情况就是不应该加零
然后果断被喷,虽然知道甲方爸爸要但是就是错的也是要加,行吧,直接上代码。
原先代码:
NumberToChinese(m) {debugger
let self = this;
/* let maxlength = 0;
if( m.indexOf(".")==-1){
maxlength = 15
}else{
maxlength = 14
} */
m = this.mul(m, 100);//去掉小数位
m += "";// 变成字符串
var length = m.length;
debugger
if (length < 15) {
var result = "";
debugger
for (var i = 0; i < length; i++) {
if (i == 2) {
result = "元" + result;
debugger
} else if (i == 6) {
result = "万" + result;
debugger
}
// else if (m.length === 8 && i === 7 && m.charAt(7)==='0') {
// result=result.replace("万","万零")
// debugger
// }
else if (i == 10) {
result = "亿"+ result;
debugger
if (m.substring(m.length - 8, m.length) == '00000000'){
result = "亿" + result.substring(result.length - 1, result.length)
debugger
}
}
if (m.charAt(length - i - 1) == 0) {
if (i != 0 && i != 1) {
if (
result.charAt(0) != "零" &&
result.charAt(0) != "元" &&
result.charAt(0) != "万" &&
result.charAt(0) != "亿"
) {
result = "零" + result;
debugger
}
}
continue;
}
if (m.charAt(length - i - 1) != ".") {
result =
this.toDx(m.charAt(length - i - 1)) +
this.unit[this.unit.length - i - 1] +
result;
debugger
}
}
/* result += result.charAt(result.length - 1) == "元" ? "整" : ""; */
return result;
} else {
return "已超出限额!";
}
},
/* 金额转化为人民币大写 */
toDx(n) {
//阿拉伯数字转换函数
switch (n) {
case "0":
return "零";
case "1":
return "壹";
case "2":
return "贰";
case "3":
return "叁";
case "4":
return "肆";
case "5":
return "伍";
case "6":
return "陆";
case "7":
return "柒";
case "8":
return "捌";
case "9":
return "玖";
}
},
unit: new Array(
"仟",
"佰",
"拾",
"",
"仟",
"佰",
"拾",
"",
"仟",
"佰",
"拾",
"",
"角",
"分"
),
这是原来的方法,我们来讲解一下
m = this.mul(m, 100);//去掉小数位
m += "";// 变成字符串
var length = m.length;
首先就想注释说的首先把输入的数字放进来,然后乘100去掉小数位,然后把他变成字符换通过加一个空白的“”,然后求出length,
if (length < 15) {
var result = "";
判断最长的长度不能大于15,也就是个十百千万十万百万千万亿等等了,估计到不了那么大了,然后拿出来一个result来装我们的做好的数组
for (var i = 0; i < length; i++) {
if (i == 2) {
result = "元" + result;
debugger
} else if (i == 6) {
result = "万" + result;
debugger
}
然后我们开始遍历,我把程序全部拆开了你们到时候看的时候粘出来看一下全部,然后这个逻辑是不用考虑小数的,然后如果有小数的话就不显示(不要吐槽为啥不显示,我觉得可能是之前显示了但是需求又改了,所以会是现在这个样子)
首先如果是i等于2的时候就是意味着他是在小数点前一位有数的情况,所以在他的后面加上元,然后i等于6的时候也是也要加上万的,
else if (i == 10) {
result = "亿"+ result;
debugger
if (m.substring(m.length - 8, m.length) == '00000000'){
result = "亿" + result.substring(result.length - 1, result.length)
debugger
}
}
这个就是为了害怕真的会有数据是10,000,000,虽然真实情况很少出现但是还是要考虑到这个问题,
if (m.charAt(length - i - 1) == 0) {
if (i != 0 && i != 1) {
if (
result.charAt(0) != "零" &&
result.charAt(0) != "元" &&
result.charAt(0) != "万" &&
result.charAt(0) != "亿"
) {
result = "零" + result;
debugger
}
}
continue;
}
这个是我感觉这个里面写的为数不多的灵魂之作,合理的判断如何加零,在开头不能够以零或者元或者万或者亿添加零,这是在你的数字中出现零的情况,
if (m.charAt(length - i - 1) != ".") {
result =
this.toDx(m.charAt(length - i - 1)) +
this.unit[this.unit.length - i - 1] +
result;
debugger
}
然后这是有一个灵魂的部分toDx
,将阿拉伯数字转换成大写汉字,
unit
这个是合理位数转换判断个位,万位,亿位,上面的一个数组取值。
然后就是如何解决问题,两种方法,
// else if (m.length === 8 && i === 7 && m.charAt(7)==='0') {
// result=result.replace("万","万零")
// debugger
// }
这是通过修改里面的逻辑添加的,这个感觉可能会影响到所有的逻辑,于是我是用了下面的其实也差不多
if(m.length === 8 &&m.charAt(1)==='0' ){
result=result.replace("万","万零")
}
我在外边添加了这个,我不想有任何破坏逻辑的操作,就这么写了但是真心感觉自己很恶心。
感受
总体来说就是首先领导或者甲方说啥就是啥,一帮dd,然后维护旧项目就是一件很恶心的问题,如果没有充足的时间对于代码进行重构就是在一个屎山上堆屎,就是这样