Skip to content

Commit d6eba8f

Browse files
committed
Number filter would return incorrect value when fractional part had leading zeros.
1 parent 4295b3d commit d6eba8f

File tree

3 files changed

+45
-18
lines changed

3 files changed

+45
-18
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<a name="0.9.17"><a/>
22
# <angular/> 0.9.17 vegetable-reanimation (in progress) #
33

4+
### Bug Fixes
5+
- Number filter would return incorrect value when fractional part had leading zeros.
46

57

68
<a name="0.9.16"><a/>

src/filters.js

+29-18
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
*/
6363
angularFilter.currency = function(amount){
6464
this.$element.toggleClass('ng-format-negative', amount < 0);
65-
return '$' + angularFilter['number'].apply(this, [amount, 2]);
65+
return '$' + angularFilter.number.apply(this, [amount, 2]);
6666
};
6767

6868
/**
@@ -108,28 +108,39 @@ angularFilter.number = function(number, fractionSize){
108108
if (isNaN(number) || !isFinite(number)) {
109109
return '';
110110
}
111-
fractionSize = typeof fractionSize == $undefined ? 2 : fractionSize;
112-
var isNegative = number < 0;
113-
number = Math.abs(number);
114-
var pow = Math.pow(10, fractionSize);
115-
var text = "" + Math.round(number * pow);
116-
var whole = text.substring(0, text.length - fractionSize);
117-
whole = whole || '0';
118-
var frc = text.substring(text.length - fractionSize);
119-
text = isNegative ? '-' : '';
120-
for (var i = 0; i < whole.length; i++) {
111+
fractionSize = isUndefined(fractionSize)? 2 : fractionSize;
112+
113+
var isNegative = number < 0,
114+
pow = Math.pow(10, fractionSize),
115+
whole = '' + number,
116+
formatedText = '',
117+
i;
118+
119+
if (whole.indexOf('e') > -1) return whole;
120+
121+
number = Math.round(number * pow) / pow;
122+
fraction = ('' + number).split('.');
123+
whole = fraction[0];
124+
fraction = fraction[1] || '';
125+
if (isNegative) {
126+
formatedText = '-';
127+
whole = whole.substring(1);
128+
}
129+
130+
131+
for (i = 0; i < whole.length; i++) {
121132
if ((whole.length - i)%3 === 0 && i !== 0) {
122-
text += ',';
133+
formatedText += ',';
123134
}
124-
text += whole.charAt(i);
135+
formatedText += whole.charAt(i);
125136
}
126-
if (fractionSize > 0) {
127-
for (var j = frc.length; j < fractionSize; j++) {
128-
frc += '0';
137+
if (fractionSize) {
138+
while(fraction.length < fractionSize) {
139+
fraction += '0';
129140
}
130-
text += '.' + frc.substring(0, fractionSize);
141+
formatedText += '.' + fraction.substring(0, fractionSize);
131142
}
132-
return text;
143+
return formatedText;
133144
};
134145

135146

test/FiltersSpec.js

+14
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)