Javascript 数字逗号分隔

今天看到一段神得一塌糊涂的Javascript代码
(13223342.9269).toFixed(2)=13223342.93;
(13223342.9269).toLocaleString()=13,223,342.93;
formatNum(13223342.9269)=13,223,342.9269;
delFormat(13,223,342.9269)=13223342.9269;
//去掉逗号
function delFormat(str){
  return str.replace(/,/g,"");
 }
  
不得不承认Javascript的数学函数太弱了,四舍五入连个能设置小数位数的函数都没有,囧。只能自己往Number对象里填prototype。

最近遇到一个给数字加逗号的问题,类似将1000000转换成1,000,000。网上搜了下,代码都很长。也很凌乱,几乎是用足了replace,直到我遇到了下面这段代码。感叹,原来核心写的优美可以如此震撼人心。

原版是这样的

function formatNum(num)
{   
 if(!/^(/+|-)?(/d+)(/./d+)?$/.test(num)){alert("wrong!"); return num;}
 var a = RegExp.$1, b = RegExp.$2, c = RegExp.$3;
 var re = new RegExp().compile("(//d)(//d{3})(,|$)");
 while(re.test(b)) b = b.replace(re, "$1,$2$3");
 return a +""+ b +""+ c;
}

这是一个函数,我把它改了一下,填入prototype,方便自己开发。

Number.prototype.format = function(){ //给javascript里所有的数字添加一个原型函数,叫format()
    if(!/^(/+|-)?(/d+)(/./d+)?$/.test(this)) { //用正则表达式给使用该函数的数字做测试,如果不符合[正负(可有可无)]、[数字(重复一次以上)]、[小数点(可有可无)、数字(可有可无)]的形式。
        return NaN; //返回Not A Number,终止。
    }
    var a = RegExp.$1, b = RegExp.$2, c = RegExp.$3; //否则将刚正则表达式里的[]里三部分放入a b c三个变量中
    var re = new RegExp(); //定义一个新的正则表达式变量re
    re.compile("(//d)(//d{3})(,|$)"); //给re内部编译[一个数字]、[三个数字]、[,或者结束]的正则表达式,这里我给改了下,原版在re = new RegExp()后面直接跟.compile的写法Google Chrome的V8引擎认不出,Firefox和破IE倒都正常,所以分开写了。这个问题查了一晚上才查出来 - -#,该死,世界上为啥要有那么多浏览器,真是夭折阳寿啊
    while(re.test(b)) { //循环测试第一个正则表达式中的第二部分,即正负号后,小数点前的部分,如果符合第二个正则。
        b = b.replace(re, "$1,$2$3"); //就执行将第二部分转换为三部分,并将第一部分之后加入逗号,直到循环测试正则失败。有点绕口……
    }
    return a +""+ b +""+ c; //最后拼接返回第一个正则的三部分。
}

用的时候只要调用1000000.format();就行了。超简单。

我把alert()给去掉了,这东西太烦,调试的时候一旦弄错就老弹对话框。
第一个if return了NaN,一样能引起警觉。
还把格式整理了下,可读性稍微增强点。

可以看出原作者绝对是个精简函数到极致的人物,缩进都不舍得用4个空格 =。=,只用了1个,while是更加好了,连个{}都省。

最佩服的是此人对Javascript里正则表达式的理解,RegExp.$i这招不是随随便便哪个阿猫阿狗都会用的东西。
replace里的"",$1 $2 $3的用法居然可以像php一样在引号里面起作用,这一点估计一些老JSer都不知道。

学到不少东西,所以记一笔。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值