用逗号格式化浮点数

emu 2002-12-26 12:33:24
我自己做了两个,都显的很笨,谁能用正则写个聪明一点的?

function comma1(v){
var s = v.toString().split(".");
s[0] = s[0].split("").reverse().join("").match(/\d{1,3}/g).toString().split("").reverse().join("");
return s.join(".");
}
alert(comma1(12345678.123));

function comma2(v){
var s = v.toString();
var i = s.indexOf(".");
i = (i<0)?s.length():i;
for (i=i-3;i>0;i-=3)
s = s.substr(0,i)+","+s.substr(i);
return s;
}

alert(comma2(12345678.123));

...全文
123 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
emu 2003-01-04
  • 打赏
  • 举报
回复
呵呵你的那个小偷比较有文化。偷我的这个小偷光拿了主机,把两台打印机留下了,连笔记本的电池(那天碰巧拿了出来)和电源都留下了,害我一直担心他拿去了怎么开机啊?
llrock 2003-01-03
  • 打赏
  • 举报
回复
哈哈哈,emu(ston)真是不兴呀,一下子丢了3台,今年夏天还丢了一台呢,我当时还在家,那个贼晚上直接把防盗窗推开(那可是我的密道,坏了一直没修),直接就从窗户进来了,连打印机都搬走了,我靠,我睡得太死了,估计要是醒着,就是一场命案了,现在想想,还好命保住了。
阿门!
emu 2003-01-03
  • 打赏
  • 举报
回复
怎么结不了帖了?再up一次,明天结帖。
emu 2002-12-28
  • 打赏
  • 举报
回复
emu倒霉的时候,大家就高兴起来了呵呵。
walkingpoison 2002-12-28
  • 打赏
  • 举报
回复
唉,算了,我还是勉为其难收了剩下的2台桌面电脑吧。
emu 2002-12-28
  • 打赏
  • 举报
回复
逮住了小偷,让它去编程,如何?
Lostinet 2002-12-28
  • 打赏
  • 举报
回复
希望那个贼路过我家的时候不小心把笔记本丢到阳台上:)~~~
emu 2002-12-28
  • 打赏
  • 举报
回复
在我机器上3000次测试的结果是:


comma4:260
comma5:281
comma2:290
comma3:421
comma7:450
comma1:1112
comma6:1242


可以看到,最慢的三个都是用了array的split和join的,其中最慢的两个都是用了reverse的,比其他5个都多花了1倍以上的时间。

感到有电意外的是没有使用正则的comma2速度很快。看来对简单的传操作,用常规方法未必会比用正则慢。

emu 2002-12-28
  • 打赏
  • 举报
回复
哪本书?这是错的,小数部分不该comma的。
逍遥小贼 2002-12-28
  • 打赏
  • 举报
回复
强烈关注中,学习!!
liuzxit 2002-12-28
  • 打赏
  • 举报
回复
function formatNum(num){
num=num+""
var reg=/(-?\d+)(\d{3})/
while (reg.test(num))num = num.replace(reg, "$1,$2")
return num
}
alert(formatNum(35234234.13214))


書里教的
emu 2002-12-28
  • 打赏
  • 举报
回复
速度大比拼呵呵,虽然没有什么实际意义,不过还是可以研究一下:

function comma1(v){
var s = v.toString().split(".");
s[0] = s[0].split("").reverse().join("").match(/\d{1,3}/g).toString().split("").reverse().join("");
return s.join(".");
}

function comma2(v){
var s = v.toString();
var i = s.indexOf(".");
i = (i<0)?s.length:i;
for (i=i-3;i>0;i-=3)
s = s.substr(0,i)+","+s.substr(i);
return s;
}

function comma3(v){
var re=/(\d+)(\d{3})/,s=v.toString();
while(re.test(s))s=s.replace(re,"$1,$2");
return s;
}

function comma4(v){
var s=v.toString(),l=s.match(/^\d*/)[0].length,m=l%3?l%3:3
s=s.slice(0,m)+s.slice(m,l).replace(/(\d{3})/g,",$1")+s.slice(l);
return s;
}

function comma5(v){
var s=v.toString(),l=s.match(/^\d*/)[0].length,m=3-(l%3?l%3:3)
s=("000".slice(0,m)+s.slice(0,l)).replace(/(\d{3})/g,",$1").slice(m+1)+s.slice(l);
return s;
}

function String.prototype.reverse(){
return this.split("").reverse().join("")
}
function comma6(v){
var s = v.toString().split(".");
s[0] = s[0].reverse().match(/\d{1,3}/g).toString().reverse();
return s.join(".");
}
function comma7(v){
var s=v.toString().split("."),r=new RegExp("(\\d{"+(3-s[0].length%3)%3+"}),","g")
s[0]=s[0].match(/\d{1,3}/g).toString().replace(r,",$1");
return s.join(".");
}

comma1(0);comma2(0);comma3(0);comma4(0);comma5(0);comma6(0);comma7(0);

var td0 = new Date();
for (var i=0;i<1000;i++) comma1(1234567890123456)
var td1 = new Date();
for (var i=0;i<1000;i++) comma2(1234567890123456)
var td2 = new Date();
for (var i=0;i<1000;i++) comma3(1234567890123456)
var td3 = new Date();
for (var i=0;i<1000;i++) comma4(1234567890123456)
var td4 = new Date();
for (var i=0;i<1000;i++) comma5(1234567890123456)
var td5 = new Date();
for (var i=0;i<1000;i++) comma6(1234567890123456)
var td6 = new Date();
for (var i=0;i<1000;i++) comma7(1234567890123456)
var td7 = new Date();

alert("comma1:"+(td1-td0)+"\ncomma2:"+(td2-td1)+"\ncomma3:"+(td3-td2)+"\ncomma4:"+(td4-td3)+"\ncomma5:"+(td5-td4)+"\ncomma6:"+(td6-td5)+"\ncomma7:"+(td7-td6))
emu 2002-12-28
  • 打赏
  • 举报
回复
唉,写错了:i = (i<0)?s.length():i; 应该是 i = (i<0)?s.length:i;

以上7种方法全部通过,但是有共同的bug就是在toString的时候位数太多会被舍入:

function comma1(v){
var s = v.toString().split(".");
s[0] = s[0].split("").reverse().join("").match(/\d{1,3}/g).toString().split("").reverse().join("");
return s.join(".");
}

function comma2(v){
var s = v.toString();
var i = s.indexOf(".");
i = (i<0)?s.length:i;
for (i=i-3;i>0;i-=3)
s = s.substr(0,i)+","+s.substr(i);
return s;
}

function comma3(v){
var re=/(\d+)(\d{3})/,s=v.toString();
while(re.test(s))s=s.replace(re,"$1,$2");
return s;
}

function comma4(v){
var s=v.toString(),l=s.match(/^\d*/)[0].length,m=l%3?l%3:3
s=s.slice(0,m)+s.slice(m,l).replace(/(\d{3})/g,",$1")+s.slice(l);
return s;
}

function comma5(v){
var s=v.toString(),l=s.match(/^\d*/)[0].length,m=3-(l%3?l%3:3)
s=("000".slice(0,m)+s.slice(0,l)).replace(/(\d{3})/g,",$1").slice(m+1)+s.slice(l);
return s;
}

function String.prototype.reverse(){
return this.split("").reverse().join("")
}
function comma6(v){
var s = v.toString().split(".");
s[0] = s[0].reverse().match(/\d{1,3}/g).toString().reverse();
return s.join(".");
}
function comma7(v){
var s=v.toString().split("."),r=new RegExp("(\\d{"+(3-s[0].length%3)%3+"}),","g")
s[0]=s[0].match(/\d{1,3}/g).toString().replace(r,",$1");
return s.join(".");
}

function test(v){
var st = comma1(v)+"\n"+comma2(v)+"\n"+comma3(v)+"\n"+comma4(v)+"\n"+comma5(v)+"\n"+comma6(v)+"\n"+comma7(v);
alert(st);
}

test(1)
test(12)
test(123)
test(1244)
test(1.123)
test(12.123)
test(123.123)
test(1234.123)
test(12345678901234)
test(12345678901234.123)
test(12345678901234567)
test(12345678901234567.123)


孟子E章 2002-12-26
  • 打赏
  • 举报
回复
自言自语说谁呢:)
emu 2002-12-26
  • 打赏
  • 举报
回复
正所谓恶有恶报,谁叫我老得罪人呢 :-P
emu 2002-12-26
  • 打赏
  • 举报
回复
昨晚遭了贼,丢了三台电脑,其中一台笔记本。郁闷中。借机散点分吧。
在派出所报案的时候,报案的人竟然排起了长队。都说这个圣诞是小偷的盛诞,偷疯了。正打算搬家……。
emu 2002-12-26
  • 打赏
  • 举报
回复
呵呵大虾就是大虾,新招式层出不穷。
qiushuiwuhen 2002-12-26
  • 打赏
  • 举报
回复
<script>
function comma(v){
var s=v.toString().split("."),r=new RegExp("(\\d{"+(3-s[0].length%3)%3+"}),","g")
s[0]=s[0].match(/\d{1,3}/g).toString().replace(r,",$1");
return s.join(".");
}
alert(comma(1234567890123));
alert(comma(12345678.123));
alert(comma(1234567.123));
alert(comma(123456.123));
</script>
wgrabob1 2002-12-26
  • 打赏
  • 举报
回复
看看
—————————————————————————————————
想我所想  做我所做 156838384 ^-^
Reker熊 2002-12-26
  • 打赏
  • 举报
回复
鄙人正则没有深究过,能够实现就可以了,一般不考虑效率,不过感觉秋水说的
<script>
function comma(v){
var re=/(\d+)(\d{3})/,s=v.toString();
while(re.test(s))s=s.replace(re,"$1,$2");
return s;
}
alert(comma(12345678.123));
</script>这个不错
加载更多回复(10)

87,996

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧