Created
October 28, 2013 18:31
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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 | |
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
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