使用Javascript或jQuery为总计添加千位分隔符?

时间:2010-04-15 14:54:52

标签: jquery

我有一个函数可以对html表中的一列数据进行求和。它确实令人钦佩,我只想把它放在那里,需要将数千个分开。最初,您会注意到,添加的数字中有逗号。因此该函数将添加它们,它们将被删除。如何在那里添加逗号?

<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>

12 个答案:

答案 0 :(得分:76)

$(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;
}

答案 1 :(得分:17)

这将添加千位分隔符,同时保留给定数字的小数部分:

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];

答案 2 :(得分:16)

使用toLocaleString()
在你的情况下做:

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

答案 3 :(得分:4)

bit

使用:

<script>
function numberWithCommas(x) {
    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
</script>

==> 200,000

答案 4 :(得分: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

答案 5 :(得分: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"   )
    ;
}

不方便。

答案 6 :(得分: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

希望这有助于某人。

答案 7 :(得分:1)

我在某处使用以下方法:

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;  

使用split-reverse-join是一种偷偷摸摸的方式,从字符串的后面到前面,以3个为一组。可能有一种更简单的方法,但它感觉很直观。

答案 8 :(得分:1)

格式化数字的最简单方法是使用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

答案 9 :(得分: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,"));
});

答案 10 :(得分:0)

似乎应该将其作为已批准的答案...

Intl.NumberFormat('en-US').format(count)

请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat

答案 11 :(得分:-1)

递归解决方案:

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('');
}