记录人生中被上了一课

嗯,今天成功了的被上了一课,就是很气特别气嗯,就是这样,有一些东西自己知道但是还是会生气。

问题:

就是一个很正常的功能,会计大小写数字转换,然后有一个神器的数字
叫做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,然后维护旧项目就是一件很恶心的问题,如果没有充足的时间对于代码进行重构就是在一个屎山上堆屎,就是这样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

又是重名了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值