2010-04-15 41 views
31

我有一个函数,汇总一个HTML表中的数据列。它的确如此令人敬佩,只是我想让它把逗号分隔开来,这些逗号需要将数千个分开。最初,你会注意到,在添加的数字中有逗号。因此,该功能将添加它们,它们被删除。我如何在那里添加逗号?用Javascript或jQuery添加千位分隔符?

<script type="text/javascript"> 
    function sumOfColumns(tableID, columnIndex, hasHeader) { 
     var tot = 0; 
     $("#" + tableID + " tr" + (hasHeader ? ":gt(0)" : "")) 
      .children("td:nth-child(" + columnIndex + ")") 
      .each(function() { 
       tot += parseInt($(this).html().replace(',', '')); 
      }); 
     return "Total Pounds Entered : " + tot; 
    } 
</script> 

回答

65

$(this).html().replace(',', '')实际上不应修改页面。你确定逗号在页面中被删除吗?

如果是,这addCommas function应该做的伎俩。

function addCommas(nStr) { 
    nStr += ''; 
    var x = nStr.split('.'); 
    var x1 = x[0]; 
    var x2 = x.length > 1 ? '.' + x[1] : ''; 
    var rgx = /(\d+)(\d{3})/; 
    while (rgx.test(x1)) { 
     x1 = x1.replace(rgx, '$1' + ',' + '$2'); 
    } 
    return x1 + x2; 
} 
+0

伟大的作品,谢谢! – ibz 2010-04-29 11:12:15

+0

它适合我。非常感谢! – TommyDo 2015-06-30 07:54:58

+1

[我做了一个*稍微*更傻的版本,检查nStr是否实际上是一个数字。](https://github.com/Blacksilver42/website-scripts/blob/master/thousep2.js) – Blacksilver 2017-10-15 19:10:49

16

这将增加千和分隔符,同时保持一个定数的小数部分:

function format(n, sep, decimals) { 
    sep = sep || "."; // Default to period as decimal separator 
    decimals = decimals || 2; // Default to 2 decimals 

    return n.toLocaleString().split(sep)[0] 
     + sep 
     + n.toFixed(decimals).split(sep)[1]; 
} 

format(4567354.677623); // 4,567,354.68 

你也可以探测的语言环境与小数点分隔符:

var sep = (0).toFixed(1)[1]; 
+0

toLocaleString只适用于Date对象:https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Date/toLocaleString – dave1010 2010-04-15 15:29:47

+0

toLocaleString不添加千分隔符。经过Firefox 3.5.9/Snow Leopard测试。 – ibz 2010-04-29 11:01:03

+0

@ dave1010:你错了:https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Objects/Number/ToLocaleString – 2010-04-30 15:19:45

0

我的地方采用以下方法:

var value = 123456789.9876543 // i.e. some decimal number 

var num2 = value.toString().split('.'); 
var thousands = num2[0].split('').reverse().join('').match(/.{1,3}/g).join(','); 
var decimals = (num2[1]) ? '.'+num2[1] : ''; 

var answer = thousands.split('').reverse().join('')+decimals; 

使用拆分反向连接是一种偷偷摸摸的工作方式,从字符串的后面到前面,以3个为一组。可能有一种更简单的方法来做到这一点,但它感觉很直观。

2

这是我要做的事:

// 2056776401.50 = 2,056,776,401.50 
function humanizeNumber(n) { 
    n = n.toString() 
    while (true) { 
    var n2 = n.replace(/(\d)(\d{3})($|,|\.)/g, '$1,$2$3') 
    if (n == n2) break 
    n = n2 
    } 
    return n 
} 

或者,在CoffeeScript中:

# 2056776401.50 = 2,056,776,401.50 
humanizeNumber = (n) -> 
    n = n.toString() 
    while true 
    n2 = n.replace /(\d)(\d{3})($|,|\.)/g, '$1,$2$3' 
    if n == n2 then break else n = n2 
    n 
2

考虑一下:

function group1k(s) { 
    return (""+s) 
     .replace(/(\d+)(\d{3})(\d{3})$/ ,"$1 $2 $3") 
     .replace(/(\d+)(\d{3})$/   ,"$1 $2" ) 
     .replace(/(\d+)(\d{3})(\d{3})\./ ,"$1 $2 $3.") 
     .replace(/(\d+)(\d{3})\./  ,"$1 $2." ) 
    ; 
} 

它是什么999.999.999下一个快速解决方案,这通常是足够的。我知道这些缺点,我并不是说这是最终的武器 - 但它与其他人一样快,我发现这个更具可读性。如果你不需要小数,你可以更简化它:

function group1k(s) { 
    return (""+s) 
     .replace(/(\d+)(\d{3})(\d{3})$/ ,"$1 $2 $3") 
     .replace(/(\d+)(\d{3})$/  ,"$1 $2" ) 
    ; 
} 

是不是很方便。

11

使用toLocaleString()
你的情况做:

return "Total Pounds Entered : " + tot.toLocaleString(); 
+0

非常简单,但尚未得到浏览器的广泛支持:( – 2015-05-04 19:26:41

+0

我无法使用它,因为它依赖于浏览器语言环境,其他功能很强大 – StaNov 2015-05-20 06:55:02

0

一个递归解决方案:

function thousands(amount) { 
    if(/\d{3}\d+/.test(amount)) { 
    return thousands(amount.replace(/(\d{3}?)(,|$)/, ',$&')); 
    } 
    return amount; 
} 

另一个分裂的解决方案:

function thousands (amount) { 
    return amount.split('').reverse().join('').replace(/\d{3}/g, '$&,').split('').reverse().join(''); 
} 
+0

这不起作用顺便说一句。它在数字前加逗号,例如456变成“,456”。 – Johncl 2017-01-20 10:10:23

2

我知道这是一个超级老岗位并有很好的答案,但如果有人感兴趣,那里是一个jQuery插件,通过进行包含和简单的调用来简化数字格式(数千格式,小数位数,自定义千位分隔符等)。 有很多功能和文档就足够了。 它叫做jQuery Number

你只是它包含:

<script type="text/javascript" src="jquery/jquery.number.min.js"></script> 

,然后使用它:

上的自动格式化HTML输入:$('input.number').number(true, 2);

在一个JS调用:$.number(5020.2364, 2); // Outputs: 5,020.24

希望这个帮助某人。

0

下面是工作示例:

$("#estimated-amount-due .content").html("$" + miniCartTotal.toFixed(2).replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")); 

这条线就足够了,它为我工作。检查下面的完整代码。让我知道它是否也适用于您。格式化数字

$(".action.showcart").on('click', function() { 
    var miniCartTotal = $("#estimated-subtotal .price").html(); 
    var miniCartTotalString = miniCartTotal.replace(/\$/g, ''); 
    var miniCartTotalString = miniCartTotalString.replace(/,/g, ''); 
    var configValue = 5; 

    miniCartTotal = parseFloat(miniCartTotalString) + configValue; 
    console.log("updated value " + miniCartTotal); 

    $("#estimated-amount-due .content").html("$" + miniCartTotal.toFixed(2).replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")); 
}); 
0

最简单的方法是使用Java的脚本功能

var numberToformat = 1000000000 
//add locality here, eg: if you need English currency add 'en' and if you need Danish currency format then use 'da-DA'. 
var locality = 'en-EN'; 
numberToformat = numberToformat.toLocaleString(locality , { 
minimumFractionDigits: 4 }) 
document.write(numberToformat); 

更多信息,请点击documentation page