diff --git a/src/ng/filter/filters.js b/src/ng/filter/filters.js index 7805085fd7d6..e05c7ebf2a35 100644 --- a/src/ng/filter/filters.js +++ b/src/ng/filter/filters.js @@ -174,10 +174,13 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac); } - // safely round numbers in JS without hitting imprecisions of floating-point arithmetics - // inspired by: - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round - number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize); + // round the number only if it's decimal + if (number.toString().indexOf('.') >= 0) { + // safely round numbers in JS without hitting imprecisions of floating-point arithmetics + // inspired by: + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round + number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize); + } var fraction = ('' + number).split(DECIMAL_SEP); var whole = fraction[0]; diff --git a/test/ng/filter/filtersSpec.js b/test/ng/filter/filtersSpec.js index 52ad6fbd6a4d..90f792d3f6ca 100644 --- a/test/ng/filter/filtersSpec.js +++ b/test/ng/filter/filtersSpec.js @@ -90,6 +90,25 @@ describe('filters', function() { expect(formatNumber(-0.0001, pattern, ',', '.', 3)).toBe('0.000'); expect(formatNumber(-0.0000001, pattern, ',', '.', 6)).toBe('0.000000'); }); + + it('should work with numbers that are close to the limit for exponent notation', function() { + // previously, numbers that n * (10 ^ fractionSize) > localLimitMax + // were ending up with a second exponent in them, then coercing to + // NaN when formatNumber rounded them with the safe rounding + // function. + + var localLimitMax = 999999999999999900000, + localLimitMin = 10000000000000000000, + exampleNumber = 444444444400000000000; + + expect(formatNumber(localLimitMax, pattern, ',', '.', 2)) + .toBe('999,999,999,999,999,900,000.00'); + expect(formatNumber(localLimitMin, pattern, ',', '.', 2)) + .toBe('10,000,000,000,000,000,000.00'); + expect(formatNumber(exampleNumber, pattern, ',', '.', 2)) + .toBe('444,444,444,400,000,000,000.00'); + + }); }); describe('currency', function() {