Skip to content

Commit 6d4935f

Browse files
fix(numberFilter): properly format small number expressed with e notation
Fixes angular#10246
1 parent e5a9b26 commit 6d4935f

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

src/ng/filter/filters.js

+8-8
Original file line numberDiff line numberDiff line change
@@ -148,13 +148,13 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
148148

149149
var hasExponent = false;
150150
if (numStr.indexOf('e') !== -1) {
151+
hasExponent = true;
151152
var match = numStr.match(/([\d\.]+)e(-?)(\d+)/);
152-
if (match && match[2] == '-' && match[3] > fractionSize + 1) {
153+
if (match && match[2] == '-' && match[3] > (fractionSize || pattern.maxFrac) + 1) {
153154
numStr = '0';
154155
number = 0;
155156
} else {
156157
formatedText = numStr;
157-
hasExponent = true;
158158
}
159159
}
160160

@@ -171,10 +171,6 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
171171
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round
172172
number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize);
173173

174-
if (number === 0) {
175-
isNegative = false;
176-
}
177-
178174
var fraction = ('' + number).split(DECIMAL_SEP);
179175
var whole = fraction[0];
180176
fraction = fraction[1] || '';
@@ -207,12 +203,16 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
207203

208204
if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize);
209205
} else {
210-
211-
if (fractionSize > 0 && number > -1 && number < 1) {
206+
fractionSize = isUndefined(fractionSize) ? pattern.maxFrac : fractionSize;
207+
if (number > -1 && number < 1) {
212208
formatedText = number.toFixed(fractionSize);
213209
}
214210
}
215211

212+
if (number === 0) {
213+
isNegative = false;
214+
}
215+
216216
parts.push(isNegative ? pattern.negPre : pattern.posPre,
217217
formatedText,
218218
isNegative ? pattern.negSuf : pattern.posSuf);

test/ng/filter/filtersSpec.js

+8
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,14 @@ describe('filters', function() {
200200
expect(number(-1e-6, 6)).toEqual('-0.000001');
201201
expect(number(-1e-7, 6)).toEqual('-0.000000');
202202
});
203+
204+
it('should filter exponentially small numbers when no fraction specified', function() {
205+
expect(number(1e-10)).toEqual('0.000');
206+
expect(number(0.0000000001)).toEqual('0.000');
207+
208+
expect(number(-1e-10)).toEqual('0.000');
209+
expect(number(-0.0000000001)).toEqual('0.000');
210+
});
203211
});
204212

205213
describe('json', function() {

0 commit comments

Comments
 (0)