toFixed() 替代函数

3
我发现许多人在JavaScript的toFixed()方法上遇到了麻烦。我自己的网站在IE7和FireFox 4.x中也出现了问题。
最终,我发现问题出在toFixed()方法上。在某些浏览器中,它似乎返回一个字符串,在其他浏览器中则不然 - 它的行为似乎是不可预测的。
因此,我决定扩展原型对象并创建自己的方法,而不是每次都需要做相同的parseFloat/integer操作。
使用这个方法,您可以将数字四舍五入到任意小数位数,并指定要使用的舍入类型:floor、ceil或null以使用标准舍入(round)。
代码如下:
     // a replacement for the toFixed() function in javascript

    Number.prototype.trimNum = function(places,rounding){

    var places,result,num = parseFloat(this),multiplier = Math.pow( 10,places );

    try {
        result = Math[rounding](num * multiplier) / multiplier;
    } catch(e){
        result = Math.round(num * multiplier) / multiplier; 
    }

    return Number( result );
} 

用法:

mynumbervar.trimNum(2,'floor') 使用 floor 进行四舍五入

mynumbervar.trimNum(2,'ceil') 使用 ceil 进行四舍五入

mynumbervar.trimNum(2) 使用 round 进行四舍五入

当然,这里的数字“2”是要保留的小数位数。

我已在PC和Mac上的IE、Safari、Chrome和FireFox中进行了测试,对我来说似乎工作得很好。

我希望这能帮助其他人避免我曾经遇到的toFixed()问题...

有人知道这方面的任何问题或建议吗?


1
你应该将这个问题表述为一个合适的问题,并提供你的解决方案作为答案。 - Felix Kling
2
exoboy,这不是一个讨论论坛。SO是一个问答网站。 - Vivin Paliath
1
@exoboy:是的。认真点。你可能想读一下这篇文章:http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ - Felix Kling
1
@jfriend00:在这种情况下,它实际上应该转到http://codereview.stackexchange.com/。 - Felix Kling
1
如果你把你的问题改成:“像这样给Number添加原型有什么缺点,这种写法有什么问题或者你有什么建议可以改进吗?” - jfriend00
显示剩余13条评论
1个回答

0

关于这个函数的一些建议:

为什么要声明一个名为“places”的本地变量,而它已经是传入的参数了? 你其实不需要try/catch。你可以将四舍五入参数默认为“round”。

// a replacement for the toFixed() function in javascript

Number.prototype.trimNum = function(places, rounding) {
    rounding = rounding || "round";
    var num = parseFloat(this), multiplier = Math.pow(10, places);
    return(Number(Math[rounding](num * multiplier) / multiplier));
}

唯一的语法差异在于,如果传递了错误的舍入值,它将失败,而您的代码会在这种情况下使用“round”。我认为如果传递了错误的操作,最好是失败。
这里有一个带有一堆测试用例的工作示例:http://jsfiddle.net/jfriend00/5KRBK/

我不小心声明了变量places。而且,我忘记使用||运算符,所以很好地发现了这个问题。这正是我所希望的——大家都能够改进我的代码,从中受益。谢谢! - exoboy
看看是否可以解决错误并重新发布您的代码。我可能最终会给你答案的信用。 - exoboy
你误解了。我的版本仍然默认四舍五入(你可以试试)。但是如果有人传递了myNum.trimNum(4, "foo"),我的版本将会抛出异常,因为那是非法操作。你的版本会悄悄地切换到“round”。我认为,在指令明显错误且你真的不知道用户希望你做什么时,抛出错误更好。如果他们调用myNum.trimNum(4),我的版本将像你的版本一样工作。 - jfriend00
这里有一个带有测试用例的工作示例:http://jsfiddle.net/jfriend00/5KRBK/ - jfriend00
我的解决方案/问题刚被以下蠢货关闭了。无论如何感谢您的支持!老实说,我已经厌倦了他们的胡言乱语,这可能是我最后一篇帖子。所以,感谢您保持开放的心态。蠢货们:由kingjiv、Marc B、Vivin Paliath、Renesis和cwolves在4分钟前关闭,理由是不是一个真正的问题。 - exoboy
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接