-
-
Save Chocksy/7202086 to your computer and use it in GitHub Desktop.
@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 | |
@rafalenden, I created a version which removes ".0" decimals and supports negative values:
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
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'
For 100 000 it returns 100.0k