Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit aeb0d01

Browse files
committed
fix(formatNumber): allow negative fraction size
1 parent 3d158f6 commit aeb0d01

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
@@ -86,6 +86,26 @@ describe('filters', function() {
8686
expect(num).toBe('123.100');
8787
});
8888

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

0 commit comments

Comments
 (0)