Search code examples
javascriptjqueryroundingcurrency

Is there a way to round numbers into a reader friendly format? (e.g. $1.1k)


Much like the Stackoverlow reputation rounding, I'm hoping to do the same thing with currency

$1,000 => 1k

$1,000,000 => 1m

How can I achieve this in JavaScript (preferably in jQuery)?


Solution

  • Here is a simple function to do it:

    function abbrNum(number, decPlaces) {
      // 2 decimal places => 100, 3 => 1000, etc
      decPlaces = Math.pow(10, decPlaces);
    
      // Enumerate number abbreviations
      var abbrev = ["k", "m", "b", "t"];
    
      // Go through the array backwards, so we do the largest first
      for (var i = abbrev.length - 1; i >= 0; i--) {
    
        // Convert array index to "1000", "1000000", etc
        var size = Math.pow(10, (i + 1) * 3);
    
        // If the number is bigger or equal do the abbreviation
        if (size <= number) {
          // Here, we multiply by decPlaces, round, and then divide by decPlaces.
          // This gives us nice rounding to a particular decimal place.
          number = Math.round(number * decPlaces / size) / decPlaces;
    
          // Handle special case where we round up to the next abbreviation
          if ((number == 1000) && (i < abbrev.length - 1)) {
            number = 1;
            i++;
          }
    
          // Add the letter for the abbreviation
          number += abbrev[i];
    
          // We are done... stop
          break;
        }
      }
    
      return number;
    }
    console.log(abbrNum(1200, 3))

    Outputs:

    abbrNum(12 , 1)          => 12
    abbrNum(0 , 2)           => 0
    abbrNum(1234 , 0)        => 1k
    abbrNum(34567 , 2)       => 34.57k
    abbrNum(918395 , 1)      => 918.4k
    abbrNum(2134124 , 2)     => 2.13m
    abbrNum(47475782130 , 2) => 47.48b
    

    Demo: http://jsfiddle.net/jtbowden/SbqKL/