zoukankan      html  css  js  c++  java
  • 币种大写算法(js)

    注意事项:小数精度处理问题,n*10出现精度误差,如1.88*10计算得18.799999999999997,实际想要的数据是18.8;
        
    思路一:小数变成整数(通过字符串处理),计算后,变成小数;
          
    思路二:用科学计算法进行计算。
    export function RMBFitter(n){
      /**金额大写的转换 */
      var fraction = ['角', '分'];
      var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
      var unit = [ ['元', '万', '亿'], ['', '拾', '佰', '仟']  ];
      //var head = n < 0? '欠': '';
      n = Math.abs(n);
      var s = '';
      // if (n > Math.floor(n)) {
      //   let str = n * 100 + ''
      //   let numlist = str.substr(-2, 2).split('')
      //   // 这里在前面取数的时候定死了2位小数。0
      //   let num0 = numlist[0] - 0
      //   let num1 = numlist[1] - 0
      //   if (num1 === 0 && num0 === 0) {
      //     s = ''
      //   } else if (num1 === 0) {
      //     s = digit[num0] + '角'
      //   } else {
      //     s = digit[num0] + '角' + digit[num1] + '分'
      //   }
      // }
      // console.log((digit[Math.floor(n * Math.pow(10, 1)) % 10] + fraction[0]).replace(/零./, ''));
      // console.log((digit[Math.floor(n * Math.pow(10, 2)) % 10] + fraction[1]).replace(/零./, ''));
      for (var i = 0; i < fraction.length; i++)
      {
          // console.log(digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]);
          s += (digit[Math.floor(n * Math.pow(10, i+1)) % 10] + fraction[i]).replace(/零./, '');
      }
    
      s = s || '整';
      n = Math.floor(n);
      for (var i = 0; i < unit[0].length && n > 0; i++)
      {
          var p = '';
          for (var j = 0; j < unit[1].length && n > 0; j++)
          {
              p = digit[n % 10] + unit[1][j] + p;
              n = Math.floor(n / 10);
          }
          s = p.replace(/(零.)*零$/, '').replace(/^$/, '零')  + unit[0][i] + s;
      }
      //return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
      var result = s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
      if(result.indexOf('分')>0&&result.indexOf('角')<0){
          result = result.replace(/元/g, '元零');
      }
      return result;
    }
    

      以上处理方式在处理小数的时候,会有精度问题(2374.24),因此需要单独处理小数部分,先将小数部分变成字符串,然后再做处理

      let nString = n + '';
      if(nString.indexOf('.')>-1){
        nString = nString.split('.');
        nString = nString[1];
        if(nString.length>2){
          alert('请确保输入的值不能超过两位小数,否则无法核算成大写金额');
          return;
        }
        if(nString.length>1){
          let jiao = nString[0];
          let fen = nString[1];
          s = (digit[Number(jiao)] + '角' + digit[Number(fen)]+ '分').replace(/零./, '');
        }else{
          let jiao = nString;
          s = (digit[Number(jiao)] + '角');
        }
      }
  • 相关阅读:
    SSH Config 那些你所知道和不知道的事 (转)
    解决npm ERR! Unexpected end of JSON input while parsing near的方法
    ES查询-term VS match (转)
    ES查询-match VS match_phrase
    安装使用aria2下载百度网盘内容(转)
    基于CSS3鼠标滑过放大突出效果
    基于jQuery的新浪游戏首页幻灯片
    基于animation.css实现动画旋转特效
    基于jQuery左右滑动切换特效
    基于html5顶部导航3D翻转展开特效
  • 原文地址:https://www.cnblogs.com/cx709452428/p/9759528.html
Copyright © 2011-2022 走看看