11

I'm trying to increment a number inside an element on page. But I need the number to include a comma for the thousandth place value. (e.g. 45,000 not 45000)

<script>
// Animate the element's value from x to y:
  $({someValue: 40000}).animate({someValue: 45000}, {
      duration: 3000,
      easing:'swing', // can be anything
      step: function() { // called on every step
          // Update the element's text with rounded-up value:
          $('#el').text(Math.round(this.someValue));
      }
  });
</script>
<div id="el"></div>

How can I increment a number using animate with comma?

3

3 Answers 3

45

Working Demo http://jsfiddle.net/4v2wK/

Feel free to change it more for your need, you can also look at the currency formatter, Hope this will fit your need :)

Code

// Animate the element's value from x to y:
  var $el = $("#el"); //[make sure this is a unique variable name]
  $({someValue: 40000}).animate({someValue: 45000}, {
      duration: 3000,
      easing:'swing', // can be anything
      step: function() { // called on every step
          // Update the element's text with rounded-up value:
          $el.text(commaSeparateNumber(Math.round(this.someValue)));
      }
  });

 function commaSeparateNumber(val){
    while (/(\d+)(\d{3})/.test(val.toString())){
      val = val.toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
    }
    return val;
  }

**output* enter image description here

4
  • any idea why the number is not the same? I am taking about the circle around the output. Commented May 5, 2014 at 19:43
  • Hiya @AdrianFlorescu umm how do you mean, sorry not sure what are you asking? :) you mean why the output is not say for example: 44,444? like this: jsfiddle.net/hVpqD
    – Tats_innit
    Commented May 5, 2014 at 21:05
  • @Tats_innit exactly, but looks like this is because of the animate steps. I replaced the value on complete with the original value. complete : function(){ where.text(endNr); } jsfiddle.net/5yBt8/10 Commented May 6, 2014 at 7:41
  • You should also add a complete function as such: step:function(){ //.. }, complete:function(){ $el.text(commaSeparateNumber(Math.round(this.someValue))); }
    – SuperNOVA
    Commented Jul 18, 2014 at 8:02
12

You should also add a complete function as such:

step:function(){
    //..
},
complete:function(){
    $el.text(commaSeparateNumber(Math.round(this.someValue)));
}

Updated Fiddle: Demo

2
  • Why? I'm fairly certain that the step function will be called even on the last animation step. The complete function is used to attach a callback to run after all steps are completed.
    – Bungle
    Commented Sep 5, 2015 at 5:31
  • Sometimes it wasnt showing a good last result, it was random at the end, sometimes 45000, sometimes 4995 and so on, so i've added this function, and now it works just fine. Thanks!
    – Gntvls
    Commented Oct 13, 2015 at 9:22
0

Had the same problem and used toLocaleString to put commas As suggested in the above answer I found the result deviating from the real value and I solved that by adding the complete callback function that is called when the animation is finished

value_to_be_shown=100000000
// Animate a value from 0 to `value_to_be_shown`
$({
    someValue: 0 // Starting value
}).animate({
    someValue: value_to_be_shown // Ending value
}, {
    duration: 1000, // Animation duration in milliseconds
    easing: 'swing', // Easing function to control acceleration of the animation
    step: function () { // Function to be called on every step of the animation
        // Update the element's text with the rounded-up value of `someValue`:
        $('#el_id').text(Math.round(this.someValue).toLocaleString('en-US'));
    },
    complete: function () { // Function to be called after the animation completes
        // Update the element's text with the final value
        $('#el_id').text(value_to_be_shown.toLocaleString('en-US'));
    }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
<div style="background-color:gray;width:300px;text-align:center;height:100px;padding:20px;margin:20vh auto;">
<div style="font-size:2rem;font-weight:bold" id="el_id">0</div>
</div>

Not the answer you're looking for? Browse other questions tagged or ask your own question.