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

Commit 43d5480

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

File tree

2 files changed

+39
-5
lines changed

2 files changed

+39
-5
lines changed

src/ng/filter/filters.js

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -221,18 +221,32 @@ 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
227233
parsedNumber.i = 1;
228-
digits.length = roundAt = fractionSize + 1;
229-
for (var i=0; i < roundAt; i++) digits[i] = 0;
234+
digits.length = Math.max(1, roundAt = fractionSize + 1);
235+
digits[0] = 0;
236+
for (var i=1; i < roundAt; i++) digits[i] = 0;
230237
}
231238

232-
if (digit >= 5) digits[roundAt - 1]++;
239+
if (digit >= 5) {
240+
if (roundAt - 1 < 0) {
241+
digits.unshift(1);
242+
parsedNumber.i++;
243+
} else {
244+
digits[roundAt - 1]++;
245+
}
246+
}
233247

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

237251

238252
// 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)