Skip to content

Commit 735be18

Browse files
jbedardgkalpak
authored andcommitted
fix(formatNumber): allow negative fraction size
Closes angular#13913
1 parent 3ea4477 commit 735be18

File tree

2 files changed

+44
-5
lines changed

2 files changed

+44
-5
lines changed

src/ng/filter/filters.js

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -221,18 +221,37 @@ function roundNumber(parsedNumber, fractionSize, minFrac, maxFrac) {
221221
var digit = digits[roundAt];
222222

223223
if (roundAt > 0) {
224-
digits.splice(roundAt);
224+
// Drop fractional digits beyond `roundAt`
225+
digits.splice(Math.max(parsedNumber.i, roundAt));
226+
227+
// Set non-fractional digits beyond `roundAt` to 0
228+
for (var j = roundAt; j < digits.length; j++) {
229+
digits[j] = 0;
230+
}
225231
} else {
226232
// We rounded to zero so reset the parsedNumber
233+
fractionLen = Math.max(0, fractionLen);
227234
parsedNumber.i = 1;
228-
digits.length = roundAt = fractionSize + 1;
229-
for (var i=0; i < roundAt; i++) digits[i] = 0;
235+
digits.length = Math.max(1, roundAt = fractionSize + 1);
236+
digits[0] = 0;
237+
for (var i = 1; i < roundAt; i++) digits[i] = 0;
230238
}
231239

232-
if (digit >= 5) digits[roundAt - 1]++;
240+
if (digit >= 5) {
241+
if (roundAt - 1 < 0) {
242+
for (var k = 0; k > roundAt; k--) {
243+
digits.unshift(0);
244+
parsedNumber.i++;
245+
}
246+
digits.unshift(1);
247+
parsedNumber.i++;
248+
} else {
249+
digits[roundAt - 1]++;
250+
}
251+
}
233252

234253
// Pad out with zeros to get the required fraction length
235-
for (; fractionLen < fractionSize; fractionLen++) digits.push(0);
254+
for (; fractionLen < Math.max(0, fractionSize); fractionLen++) digits.push(0);
236255

237256

238257
// Do any carrying, e.g. a digit was rounded up to 10

test/ng/filter/filtersSpec.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,26 @@ describe('filters', function() {
8585
expect(num).toBe('123.100');
8686
});
8787

88+
it('should work with negative fractionSize', function() {
89+
expect(formatNumber(49, pattern, ',', '.', -2)).toBe('0');
90+
expect(formatNumber(50, pattern, ',', '.', -2)).toBe('100');
91+
expect(formatNumber(51, pattern, ',', '.', -2)).toBe('100');
92+
expect(formatNumber(1234, pattern, ',', '.', -1)).toBe('1,230');
93+
expect(formatNumber(1234.567, pattern, ',', '.', -1)).toBe('1,230');
94+
expect(formatNumber(1235, pattern, ',', '.', -1)).toBe('1,240');
95+
expect(formatNumber(1235, pattern, ',', '.', -2)).toBe('1,200');
96+
expect(formatNumber(1235, pattern, ',', '.', -3)).toBe('1,000');
97+
expect(formatNumber(1235, pattern, ',', '.', -4)).toBe('0');
98+
expect(formatNumber(1250, pattern, ',', '.', -2)).toBe('1,300');
99+
expect(formatNumber(1000, pattern, ',', '.', -3)).toBe('1,000');
100+
expect(formatNumber(1000, pattern, ',', '.', -4)).toBe('0');
101+
expect(formatNumber(1000, pattern, ',', '.', -5)).toBe('0');
102+
expect(formatNumber(1, pattern, ',', '.', -1)).toBe('0');
103+
expect(formatNumber(1, pattern, ',', '.', -2)).toBe('0');
104+
expect(formatNumber(9, pattern, ',', '.', -1)).toBe('10');
105+
expect(formatNumber(501, pattern, ',', '.', -3)).toBe('1,000');
106+
});
107+
88108
it('should format numbers that round to zero as nonnegative', function() {
89109
expect(formatNumber(-0.01, pattern, ',', '.', 1)).toBe('0.0');
90110
expect(formatNumber(-1e-10, pattern, ',', '.', 1)).toBe('0.0');

0 commit comments

Comments
 (0)