185

How can I format numbers using a comma separator every three digits using jQuery?

For example:

╔═══════════╦═════════════╗
║   Input   ║   Output    ║
╠═══════════╬═════════════╣
║       298 ║         298 ║
║      2984 ║       2,984 ║
║ 297312984 ║ 297,312,984 ║
╚═══════════╩═════════════╝
Steve
  • 4,946
  • 12
  • 45
  • 62
  • I am new to jQuery and would like a simple function/plugin that just adds comma after every three digits if numbers are more than three digits long. Positive numbers only, no fractions, no decimals, no currency involved, and standard U.S. format (1,111) not ($1,111 or $1,111.11). I would rather having done using jQuery and not just javascript if possible and would be nice set the code set to a function so it can be applied very easily. How do I go about doing that? Appreciate everyone's input. Thanks again. – Steve Jan 02 '10 at 04:05
  • 2
    @unknown: You already have many answers. Look at the answers you have received and evaluate them to see which is best for you. If you need more clarification for one of the answers, post it as a comment to that answer. – Mark Byers Jan 02 '10 at 04:07
  • 1
    Sorry my question was not concise enough but see Doug Neiner plugin format using Paul Creasey's code for the answer. – Steve Jan 02 '10 at 04:35

15 Answers15

263

@Paul Creasey had the simplest solution as the regex, but here it is as a simple jQuery plugin:

$.fn.digits = function(){ 
    return this.each(function(){ 
        $(this).text( $(this).text().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,") ); 
    })
}

You could then use it like this:

$("span.numbers").digits();
Doug Neiner
  • 65,509
  • 13
  • 109
  • 118
  • 4
    Works perfectly! Thanks to Paul Creasey for simply, elegant code and thanks to Doug Neiner for putting it in plugin format. Credit given to both. – Steve Jan 02 '10 at 04:31
  • 4
    RC @Mark Byers The syntax is right. '999.9999'.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,") returns '999.9,999' though. – bendewey Jan 02 '10 at 04:44
  • @bendewey the OP didn't update his question, but he did add this comment "Positive numbers only, no fractions, no decimals, no currency involved, and standard U.S. format" which @Paul Creasey's answer provided. – Doug Neiner Jan 02 '10 at 04:49
  • 6
    Made a slight mod for input fields: `$.fn.digits = function(){ return this.each(function(){ $(this).val( $(this).val().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,") ); }) } ` – mpemburn Jan 17 '12 at 13:53
  • 3
    I think this would be better suited to a jQuery name-spaced utility style function, e.g. `$.digits = function() { ... };`. – alex Sep 16 '13 at 14:50
  • 72
    The fastest way is `number.toLocaleString("en");` – Derek 朕會功夫 Apr 21 '14 at 21:11
  • `function addCommas(t) {return String(t).replace(/(\d)(?=(\d{3})+$)/g, "$1,")}`. source: [http://icompile.eladkarako.com/javascript-snippet-add-commas-to-number-by-regular-expression/](http://icompile.eladkarako.com/javascript-snippet-add-commas-to-number-by-regular-expression/) –  Aug 01 '14 at 16:45
  • javvascript has a function for this..... – M H Jul 03 '15 at 02:40
  • For some reason, this method added 1 to my total. But using `number.toLocaleString("en");` worked perfectly. – thingEvery Feb 22 '18 at 05:33
131

You could use Number.toLocaleString():

var number = 1557564534;
document.body.innerHTML = number.toLocaleString();
// 1,557,564,534
Abhijeet
  • 1,515
  • 1
  • 11
  • 21
  • I've try it, but not working on live server, but working on localhost.. – Abed Putra Sep 04 '18 at 09:23
  • 1
    @eladsilver https://www.w3schools.com/jsref/jsref_tolocalestring.asp in all browsers – ricks Oct 12 '18 at 20:49
  • This worked the easiest for me. I needed currency and commas. I was able to set properties as well: `var n = 26787.89 var myObjCurrency = { style: "currency", currency: "USD", currencyDisplay : "symbol" } n.toLocaleString("en-US", myObjCurrency));` – AWP Jul 07 '20 at 20:13
82

Something like this if you're into regex, not sure of the exact syntax for the replace tho!

MyNumberAsString.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
Paul Creasey
  • 28,321
  • 10
  • 54
  • 90
27

You could try NumberFormatter.

$(this).format({format:"#,###.00", locale:"us"});

It also supports different locales, including of course US.

Here's a very simplified example of how to use it:

<html>
    <head>
        <script type="text/javascript" src="jquery.js"></script>
        <script type="text/javascript" src="jquery.numberformatter.js"></script>
        <script>
        $(document).ready(function() {
            $(".numbers").each(function() {
                $(this).format({format:"#,###", locale:"us"});
            });
        });
        </script>
    </head>
    <body>
        <div class="numbers">1000</div>
        <div class="numbers">2000000</div>
    </body>
</html>

Output:

1,000
2,000,000
Mark Byers
  • 811,555
  • 193
  • 1,581
  • 1,452
  • I took a glance at this plugin and from author description, it was meant to be used in form input fields. How can I adopt it to be applied to 2984 so it formats to 2,984 without decimals. I tried $('span.numbers').format({format:"#,###", locale:"us"}); but nothing happend. Still examing plugin, playing around with it. Sorry I am a jQuery newbie :-) – Steve Jan 02 '10 at 04:13
  • +1 Great to know about this plugin. I agree that for growth and future internationalization, this would be the best route to follow. – Doug Neiner Jan 02 '10 at 04:35
  • Here is the link to its GitHub repo. https://github.com/hardhub/jquery-numberformatter – Mwangi Thiga Jun 10 '17 at 06:09
27

Use function Number();

$(function() {

  var price1 = 1000;
  var price2 = 500000;
  var price3 = 15245000;

  $("span#s1").html(Number(price1).toLocaleString('en'));
  $("span#s2").html(Number(price2).toLocaleString('en'));
  $("span#s3").html(Number(price3).toLocaleString('en'));

  console.log(Number(price).toLocaleString('en'));

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<span id="s1"></span><br />
<span id="s2"></span><br />
<span id="s3"></span><br />
bamossza
  • 3,676
  • 1
  • 29
  • 28
  • Thanks, I used your answer. It might be worth noting that this only supports numbers up to 15 digits in length. – tallpaul Nov 30 '15 at 12:36
27

2016 Answer:

Javascript has this function, so no need for Jquery.

yournumber.toLocaleString("en");
Kamy D
  • 1,071
  • 2
  • 13
  • 23
  • 2
    Will this work on all browsers? It is working fine on chrome. Will it work on IE9+ & opera, safari ? – zeppelin Jul 12 '16 at 14:22
  • @zeppelin https://www.w3schools.com/jsref/jsref_tolocalestring.asp supports all browsers – ricks Oct 12 '18 at 20:49
  • 1
    Just make sure the number you call it on is a number type (int, float, etc..) and not a string. – el3ati2 Feb 28 '20 at 22:37
24

This is not jQuery, but it works for me. Taken from this site.

function addCommas(nStr) {
    nStr += '';
    x = nStr.split('.');
    x1 = x[0];
    x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1 + x2;
}
Shadow The GPT Wizard
  • 66,030
  • 26
  • 140
  • 208
Ray
  • 21,485
  • 5
  • 48
  • 64
17

A more thorough solution

The core of this is the replace call. So far, I don't think any of the proposed solutions handle all of the following cases:

  • Integers: 1000 => '1,000'
  • Strings: '1000' => '1,000'
  • For strings:
    • Preserves zeros after decimal: 10000.00 => '10,000.00'
    • Discards leading zeros before decimal: '01000.00 => '1,000.00'
    • Does not add commas after decimal: '1000.00000' => '1,000.00000'
    • Preserves leading - or +: '-1000.0000' => '-1,000.000'
    • Returns, unmodified, strings containing non-digits: '1000k' => '1000k'

The following function does all of the above.

addCommas = function(input){
  // If the regex doesn't match, `replace` returns the string unmodified
  return (input.toString()).replace(
    // Each parentheses group (or 'capture') in this regex becomes an argument 
    // to the function; in this case, every argument after 'match'
    /^([-+]?)(0?)(\d+)(.?)(\d+)$/g, function(match, sign, zeros, before, decimal, after) {

      // Less obtrusive than adding 'reverse' method on all strings
      var reverseString = function(string) { return string.split('').reverse().join(''); };

      // Insert commas every three characters from the right
      var insertCommas  = function(string) { 

        // Reverse, because it's easier to do things from the left
        var reversed           = reverseString(string);

        // Add commas every three characters
        var reversedWithCommas = reversed.match(/.{1,3}/g).join(',');

        // Reverse again (back to normal)
        return reverseString(reversedWithCommas);
      };

      // If there was no decimal, the last capture grabs the final digit, so
      // we have to put it back together with the 'before' substring
      return sign + (decimal ? insertCommas(before) + decimal + after : insertCommas(before + after));
    }
  );
};

You could use it in a jQuery plugin like this:

$.fn.addCommas = function() {
  $(this).each(function(){
    $(this).text(addCommas($(this).text()));
  });
};
Nathan Long
  • 122,748
  • 97
  • 336
  • 451
11

Very Easy way is to use toLocaleString() function

tot = Rs.1402598 //Result : Rs.1402598

tot.toLocaleString() //Result : Rs.1,402,598

Updated : 23/01/2021

The Variable Should be in number format. Example :

Number(tot).toLocaleString() //Result : Rs.1,402,598
Khn Rzk
  • 1,124
  • 2
  • 15
  • 26
9

You can also look at the jquery FormatCurrency plugin (of which I am the author); it has support for multiple locales as well, but may have the overhead of the currency support that you don't need.

$(this).formatCurrency({ symbol: '', roundToDecimalPlace: 0 });
Matt
  • 74,352
  • 26
  • 153
  • 180
bendewey
  • 39,709
  • 13
  • 100
  • 125
5

Here is my javascript, tested on firefox and chrome only

<html>
<header>
<script>
    function addCommas(str){
        return str.replace(/^0+/, '').replace(/\D/g, "").replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    }

    function test(){
        var val = document.getElementById('test').value;
        document.getElementById('test').value = addCommas(val);
    }
</script>
</header>
<body>
<input id="test" onkeyup="test();">
</body>
</html>
Lam
  • 61
  • 1
  • 3
2
function formatNumberCapture () {
$('#input_id').on('keyup', function () {
    $(this).val(function(index, value) {
        return value
            .replace(/\D/g, "")
            .replace(/\B(?=(\d{3})+(?!\d))/g, ",")
            ;
    });
});

You can try this, it works for me

benoit1521
  • 61
  • 2
0

use this code to add only number and add comma after three digit in input text from jquery:

$(".allow-numeric-addcomma").on("keypress  blur", function (e) {
   return false; 
});

$(".allow-numeric-addcomma").on("keyup", function (e) {

    var charCode = (e.which) ? e.which : e.keyCode
if (String.fromCharCode(charCode).match(/[^0-9]/g))
    return false;

value = $(this).val().replace(/,/g, '') + e.key;
var nStr = value + '';
nStr = nStr.replace(/\,/g, "");
x = nStr.split('.');
x1 = x[0];
x2 = x.length > 1 ? '.' + x[1] : '';
var rgx = /(\d+)(\d{3})/;
while (rgx.test(x1)) {
    x1 = x1.replace(rgx, '$1' + ',' + '$2');
}

$(this).val(x1 + x2);
return false;
});
sajaf
  • 7
  • 3
0

This code work for me

 function checkPrice() {
                    $('input.digits').keyup(function (event) {
                        // skip for arrow keys
                        if (event.which >= 37 && event.which <= 40) {
                            event.preventDefault();
                        }
                        var $this = $(this);
                        var num = $this.val().replace(/,/g, '');
                        // the following line has been simplified. Revision history contains original.
                        $this.val(num.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,"));
                    });
                }

Your texbox sample

<input type="text" name="price" id="price" class="form-control digits" onkeyup="checkPrice()"  >
Sully
  • 392
  • 4
  • 14
0
var num = 1234567.89;

var commas = num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
Ron
  • 1,901
  • 4
  • 19
  • 38