Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e520c63

Browse files
committed
Number filter would return incorrect value when fractional part had leading zeros.
1 parent 3fa68e4 commit e520c63

File tree

3 files changed

+45
-18
lines changed

3 files changed

+45
-18
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
- fixed intentation code that caused some of the snippets on docs.angularjs.org to be mangled.
2222
- many small improvements of the api docs.
2323

24+
### Bug Fixes
25+
- Number filter would return incorrect value when fractional part had leading zeros.
2426

2527

2628
<a name="0.9.14"><a/>

src/filters.js

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
*/
3535
angularFilter.currency = function(amount){
3636
this.$element.toggleClass('ng-format-negative', amount < 0);
37-
return '$' + angularFilter['number'].apply(this, [amount, 2]);
37+
return '$' + angularFilter.number.apply(this, [amount, 2]);
3838
};
3939

4040
/**
@@ -80,28 +80,39 @@ angularFilter.number = function(number, fractionSize){
8080
if (isNaN(number) || !isFinite(number)) {
8181
return '';
8282
}
83-
fractionSize = typeof fractionSize == $undefined ? 2 : fractionSize;
84-
var isNegative = number < 0;
85-
number = Math.abs(number);
86-
var pow = Math.pow(10, fractionSize);
87-
var text = "" + Math.round(number * pow);
88-
var whole = text.substring(0, text.length - fractionSize);
89-
whole = whole || '0';
90-
var frc = text.substring(text.length - fractionSize);
91-
text = isNegative ? '-' : '';
92-
for (var i = 0; i < whole.length; i++) {
83+
fractionSize = fractionSize == undefined ? 2 : fractionSize;
84+
85+
var isNegative = number < 0,
86+
pow = Math.pow(10, fractionSize),
87+
whole = '' + number,
88+
formatedText = '',
89+
i;
90+
91+
if (whole.indexOf('e') > -1) return whole;
92+
93+
number = Math.round(number * pow) / pow;
94+
fraction = ('' + number).split('.');
95+
whole = fraction[0];
96+
fraction = fraction[1] || '';
97+
if (isNegative) {
98+
formatedText = '-';
99+
whole = whole.substring(1);
100+
}
101+
102+
103+
for (i = 0; i < whole.length; i++) {
93104
if ((whole.length - i)%3 === 0 && i !== 0) {
94-
text += ',';
105+
formatedText += ',';
95106
}
96-
text += whole.charAt(i);
107+
formatedText += whole.charAt(i);
97108
}
98-
if (fractionSize > 0) {
99-
for (var j = frc.length; j < fractionSize; j++) {
100-
frc += '0';
109+
if (fractionSize) {
110+
while(fraction.length < fractionSize) {
111+
fraction += '0';
101112
}
102-
text += '.' + frc.substring(0, fractionSize);
113+
formatedText += '.' + fraction.substring(0, fractionSize);
103114
}
104-
return text;
115+
return formatedText;
105116
};
106117

107118

test/FiltersSpec.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,20 @@ describe('filter', function() {
5252
expect(number(Number.NaN)).toEqual('');
5353
expect(number("1234.5678")).toEqual('1,234.57');
5454
expect(number(1/0)).toEqual("");
55+
expect(number(1, 2)).toEqual("1.00");
56+
expect(number(.1, 2)).toEqual("0.10");
57+
expect(number(.01, 2)).toEqual("0.01");
58+
expect(number(.001, 3)).toEqual("0.001");
59+
expect(number(.0001, 3)).toEqual("0.000");
60+
expect(number(9, 2)).toEqual("9.00");
61+
expect(number(.9, 2)).toEqual("0.90");
62+
expect(number(.99, 2)).toEqual("0.99");
63+
expect(number(.999, 3)).toEqual("0.999");
64+
expect(number(.9999, 3)).toEqual("1.000");
65+
expect(number(1e50, 0)).toEqual("1e+50");
66+
expect(number(1234.567, 0)).toEqual("1,235");
67+
expect(number(1234.567, 1)).toEqual("1,234.6");
68+
expect(number(1234.567, 2)).toEqual("1,234.57");
5569
});
5670
});
5771

0 commit comments

Comments
 (0)