diff options
| -rw-r--r-- | CHANGELOG.md | 2 | ||||
| -rw-r--r-- | src/filters.js | 47 | ||||
| -rw-r--r-- | test/FiltersSpec.js | 14 |
3 files changed, 45 insertions, 18 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index dfeb5535..333b153a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ <a name="0.9.17"><a/> # <angular/> 0.9.17 vegetable-reanimation (in progress) # +### Bug Fixes +- Number filter would return incorrect value when fractional part had leading zeros. <a name="0.9.16"><a/> diff --git a/src/filters.js b/src/filters.js index 63dbbd7f..49091e81 100644 --- a/src/filters.js +++ b/src/filters.js @@ -62,7 +62,7 @@ */ angularFilter.currency = function(amount){ this.$element.toggleClass('ng-format-negative', amount < 0); - return '$' + angularFilter['number'].apply(this, [amount, 2]); + return '$' + angularFilter.number.apply(this, [amount, 2]); }; /** @@ -108,28 +108,39 @@ angularFilter.number = function(number, fractionSize){ if (isNaN(number) || !isFinite(number)) { return ''; } - fractionSize = typeof fractionSize == $undefined ? 2 : fractionSize; - var isNegative = number < 0; - number = Math.abs(number); - var pow = Math.pow(10, fractionSize); - var text = "" + Math.round(number * pow); - var whole = text.substring(0, text.length - fractionSize); - whole = whole || '0'; - var frc = text.substring(text.length - fractionSize); - text = isNegative ? '-' : ''; - for (var i = 0; i < whole.length; i++) { + fractionSize = isUndefined(fractionSize)? 2 : fractionSize; + + var isNegative = number < 0, + pow = Math.pow(10, fractionSize), + whole = '' + number, + formatedText = '', + i; + + if (whole.indexOf('e') > -1) return whole; + + number = Math.round(number * pow) / pow; + fraction = ('' + number).split('.'); + whole = fraction[0]; + fraction = fraction[1] || ''; + if (isNegative) { + formatedText = '-'; + whole = whole.substring(1); + } + + + for (i = 0; i < whole.length; i++) { if ((whole.length - i)%3 === 0 && i !== 0) { - text += ','; + formatedText += ','; } - text += whole.charAt(i); + formatedText += whole.charAt(i); } - if (fractionSize > 0) { - for (var j = frc.length; j < fractionSize; j++) { - frc += '0'; + if (fractionSize) { + while(fraction.length < fractionSize) { + fraction += '0'; } - text += '.' + frc.substring(0, fractionSize); + formatedText += '.' + fraction.substring(0, fractionSize); } - return text; + return formatedText; }; diff --git a/test/FiltersSpec.js b/test/FiltersSpec.js index 092f9b7b..49b548b1 100644 --- a/test/FiltersSpec.js +++ b/test/FiltersSpec.js @@ -52,6 +52,20 @@ describe('filter', function() { expect(number(Number.NaN)).toEqual(''); expect(number("1234.5678")).toEqual('1,234.57'); expect(number(1/0)).toEqual(""); + expect(number(1, 2)).toEqual("1.00"); + expect(number(.1, 2)).toEqual("0.10"); + expect(number(.01, 2)).toEqual("0.01"); + expect(number(.001, 3)).toEqual("0.001"); + expect(number(.0001, 3)).toEqual("0.000"); + expect(number(9, 2)).toEqual("9.00"); + expect(number(.9, 2)).toEqual("0.90"); + expect(number(.99, 2)).toEqual("0.99"); + expect(number(.999, 3)).toEqual("0.999"); + expect(number(.9999, 3)).toEqual("1.000"); + expect(number(1e50, 0)).toEqual("1e+50"); + expect(number(1234.567, 0)).toEqual("1,235"); + expect(number(1234.567, 1)).toEqual("1,234.6"); + expect(number(1234.567, 2)).toEqual("1,234.57"); }); }); |
