Skip to content

Instantly share code, notes, and snippets.

@Chocksy
Created October 28, 2013 18:31
Show Gist options
  • Star 17 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Chocksy/7202086 to your computer and use it in GitHub Desktop.
Save Chocksy/7202086 to your computer and use it in GitHub Desktop.
This is a simple angularjs filter that makes big numbers into short format. 1 milion becomes 1m and 1122 becomes 1.1k
@app = angular.module 'myApp', []
@app.filter "nrFormat", ->
(number) ->
if number!=undefined
console.log number
abs = Math.abs(number)
if abs >= Math.pow(10, 12)
# trillion
number = (number / Math.pow(10, 12)).toFixed(1)+"t"
else if abs < Math.pow(10, 12) and abs >= Math.pow(10, 9)
# billion
number = (number / Math.pow(10, 9)).toFixed(1)+"b"
else if abs < Math.pow(10, 9) and abs >= Math.pow(10, 6)
# million
number = (number / Math.pow(10, 6)).toFixed(1)+"m"
else if abs < Math.pow(10, 6) and abs >= Math.pow(10, 3)
# thousand
number = (number / Math.pow(10, 3)).toFixed(1)+"k"
number
@rafenden
Copy link

rafenden commented Apr 6, 2015

For 100 000 it returns 100.0k

@timgit
Copy link

timgit commented May 20, 2015

@rafalenden, I created a version which removes ".0" decimals and supports negative values:

https://gist.github.com/timgit/7bc5896f5297301afb02

@akshaysinghi
Copy link

HTML
{{money | shortNumber}}

JAVASCRIPT
angular.module( 'app' ).filter( 'shortNumber', function() {
return function( number ) {
if ( number ) {
abs = Math.abs( number );
if ( abs >= Math.pow( 10, 12 ) ) {
// trillion
number = ( number / Math.pow( 10, 12 ) ).toFixed( 1 ) + "T";
} else if ( abs < Math.pow( 10, 12 ) && abs >= Math.pow( 10, 9 ) ) {
// billion
number = ( number / Math.pow( 10, 9 ) ).toFixed( 1 ) + "B";
} else if ( abs < Math.pow( 10, 9 ) && abs >= Math.pow( 10, 6 ) ) {
// million
number = ( number / Math.pow( 10, 6 ) ).toFixed( 1 ) + "M";
} else if ( abs < Math.pow( 10, 6 ) && abs >= Math.pow( 10, 3 ) ) {
// thousand
number = ( number / Math.pow( 10, 3 ) ).toFixed( 1 ) + "K";
}
return number;
}
};
} );

thanks

@pawelszymanski
Copy link

pawelszymanski commented Sep 26, 2016

Hi there,

thanks for inspiration, here is my version AND unit tests:

angular.module 'shortNumberFilter', []

.filter 'shortNumber', ->

  (number, precision = 0, minimum = 1000) ->
    number = parseFloat number
    return if isNaN number
    return number.toFixed precision if number < minimum
    powerOfTen = Math.floor(Math.log(Math.abs(number)) * Math.LOG10E)
    switch powerOfTen
      when 3, 4, 5
        result = (number / Math.pow(10, 3)).toFixed(precision) + 'k'
      when 6, 7, 8
        result = (number / Math.pow(10, 6)).toFixed(precision) + 'm'
      when 9, 10, 11
        result = (number / Math.pow(10, 9)).toFixed(precision) + 'b'
      when 12, 13, 14
        result = (number / Math.pow(10, 12)).toFixed(precision) + 't'
      else
        result = number.toFixed precision
    result
describe 'Short Number Filter', ->

  shortNumberFilter = null

  beforeEach module 'shortNumberFilter'
  beforeEach inject ($filter) ->
    shortNumberFilter = $filter 'shortNumber'

  describe 'when input is invalid', ->

    it 'should return undefined', ->
      expect(shortNumberFilter('non-parsable-string')).toBeUndefined()

  describe 'when input is valid', ->

    it 'should handle an integer as a parameter', ->
      expect(shortNumberFilter(1)).toBe '1'
      expect(shortNumberFilter(456)).toBe '456'

    it 'should handle a float as a parameter', ->
      expect(shortNumberFilter(10.04)).toBe '10'
      expect(shortNumberFilter(2.57, 1)).toBe '2.6'

    it 'should handle a parsable string as a parameter', ->
      expect(shortNumberFilter('12')).toBe '12'
      expect(shortNumberFilter('2.57', 1)).toBe '2.6'

    it 'should accept the precision parameter', ->
      expect(shortNumberFilter(0.04, 0)).toBe '0'
      expect(shortNumberFilter(0.04, 1)).toBe '0.0'
      expect(shortNumberFilter(0.04, 2)).toBe '0.04'
      expect(shortNumberFilter(0.04, 3)).toBe '0.040'

    it 'should default the precision parameter to `0`', ->
      expect(shortNumberFilter(1.9999)).toBe '2'

    it 'should accept the minimum parameter', ->
      expect(shortNumberFilter(12345678, 0, 123456789)).toBe '12345678'

    it 'should default the minimum parameter to `1000`', ->
      expect(shortNumberFilter(999)).toBe '999'
      expect(shortNumberFilter(1001)).toBe '1k'

    it 'should add `k` suffix', ->
      expect(shortNumberFilter(1234)).toBe '1k'
      expect(shortNumberFilter(12345)).toBe '12k'
      expect(shortNumberFilter(123456)).toBe '123k'

    it 'should add `m` suffix', ->
      expect(shortNumberFilter(1234567)).toBe '1m'
      expect(shortNumberFilter(12345678)).toBe '12m'
      expect(shortNumberFilter(123456789)).toBe '123m'

    it 'should add `b` suffix', ->
      expect(shortNumberFilter(1234567890)).toBe '1b'
      expect(shortNumberFilter(12345678901)).toBe '12b'
      expect(shortNumberFilter(123456789012)).toBe '123b'

    it 'should add `t` suffix', ->
      expect(shortNumberFilter(1234567890123)).toBe '1t'
      expect(shortNumberFilter(12345678901234)).toBe '12t'
      expect(shortNumberFilter(123456789012345)).toBe '123t'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment