UDN-企业互联网技术人气社区

板块导航

浏览  : 361
回复  : 2

[原生js] 金额转换出现的BUG

[复制链接]
cat77的头像 楼主
发表于 2017-1-3 14:53:15 | 显示全部楼层 |阅读模式
  金额转换,比如:服务端返回 0 > 0.00 0.1 > 0.10 等

  一开始由于服务端返回的金额基本都是大于0的,因此,转换函数是这么写的
  1. function format(v){
  2.     if(!v) return '0.00'
  3.     v = parseFloat(v).toFixed(2);
  4.     v = v.toString().split('.');
  5.     return (+v[0]).toLocaleString() + '.' + (v[1] >= 01 ? v[1] : '00');
  6. }
复制代码

  用着这个转换函数,一点问题也没有,直到一天,服务端返回了一个小于0的负数,并且是-0.1这样的比较特殊的,经过转换后,返回的是0.10

  怎么会这样的啊,-1.1 怎么就不报错呢?

  原来在JS中(+‘-0’)返回的是0,而不是-0;原因是()引起了表达式的隐私转换;

  不加()的时候+'-0' 返回的还是 -0

  那么是不是可以用parseInt呢?parseInt('-0') >> -0 而parseInt(+'-0') >> 0

  看上去是只要把(+v[0]) 改成 parseInt(v[0]) 就好了;
  1. function format(v){
  2.     if(!v) return '0.00'
  3.     v = parseFloat(v).toFixed(2);
  4.     v = v.toString().split('.');
  5.     return parseInt(v[0]).toLocaleString() + '.' + (v[1] >= 01 ? v[1] : '00');
  6. }
复制代码

  但现实是:这样做还是不行的;

  这是什么鬼啊?

  '-0'.toLocaleString() 明明是输出 -0的;

  ('-0').toLocaleString() 也是 -0

  -0..toLocaleString() 也是 -0

  为什么parseInt('-0').toLocaleString() 就不是 -0了呢? 这个中间又有哪些不为人知的隐私转换呢?

  我们来分解下parseInt('-0').toLocaleString()
  1. var num=parseInt('-0')  >>> -0
  2. num.toLocaleString()  >>0
复制代码

  看上去是toLocaleString的时候发生了什么的错误。

  转换思路,换个方案

  既然错误只发生在-0.x的时候,那个只要检查-0的情况,然后做特殊处理
  1. v[0]==0 && v[0].substr(0,1)=='-'
复制代码

  通过这样一行代码就能识别是 -0了
  1. function format(v){
  2.     if(!v) return '0.00'
  3.     v = parseFloat(v).toFixed(2);
  4.     v = v.toString().split('.');
  5.     return (v[0]==0 && v[0].substr(0,1)=='-'?'-':'')+(+v[0]).toLocaleString() + '.' + (v[1] >= 01 ? v[1] : '00');
  6. }
复制代码

  终于解决了金额转换的bug

相关帖子

发表于 2017-1-3 14:53:44 | 显示全部楼层
前排支持下
使用道具 举报

回复

发表于 2017-1-8 16:02:13 | 显示全部楼层
路过 帮顶 嘿嘿
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部