Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

金额转换出现的BUG #148

Open
mishe opened this issue Dec 23, 2016 · 0 comments
Open

金额转换出现的BUG #148

mishe opened this issue Dec 23, 2016 · 0 comments

Comments

@mishe
Copy link
Owner

mishe commented Dec 23, 2016

金额转换,比如:服务端返回 0 > 0.00 0.1 > 0.10 等

一开始由于服务端返回的金额基本都是大于0的,因此,转换函数是这么写的

function format(v){
    if(!v) return '0.00'
    v = parseFloat(v).toFixed(2);
    v = v.toString().split('.');
    return (+v[0]).toLocaleString() + '.' + (v[1] >= 01 ? v[1] : '00');
}

用着这个转换函数,一点问题也没有,直到一天,服务端返回了一个小于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]) 就好了;

function format(v){
    if(!v) return '0.00'
    v = parseFloat(v).toFixed(2);
    v = v.toString().split('.');
    return parseInt(v[0]).toLocaleString() + '.' + (v[1] >= 01 ? v[1] : '00');
}

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

这是什么鬼啊?

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

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

-0..toLocaleString() 也是 -0

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

我们来分解下parseInt('-0').toLocaleString()

var num=parseInt('-0')  >>> -0
num.toLocaleString()  >>0

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

转换思路,换个方案

既然错误只发生在-0.x的时候,那个只要检查-0的情况,然后做特殊处理

v[0]==0 && v[0].substr(0,1)=='-'

通过这样一行代码就能识别是 -0了

function format(v){
    if(!v) return '0.00'
    v = parseFloat(v).toFixed(2);
    v = v.toString().split('.');
    return (v[0]==0 && v[0].substr(0,1)=='-'?'-':'')+(+v[0]).toLocaleString() + '.' + (v[1] >= 01 ? v[1] : '00');
}

终于解决了金额转换的bug

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant