Skip to content

Commit b732508

Browse files
WIP: a bit of tidying up
1 parent 464e894 commit b732508

File tree

1 file changed

+50
-57
lines changed

1 file changed

+50
-57
lines changed

src/ng/filter/filters.js

+50-57
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,6 @@ function currencyFilter($locale) {
124124
</file>
125125
</example>
126126
*/
127-
128-
129127
numberFilter.$inject = ['$locale'];
130128
function numberFilter($locale) {
131129
var formats = $locale.NUMBER_FORMATS;
@@ -139,82 +137,84 @@ function numberFilter($locale) {
139137
};
140138
}
141139

142-
var isValid = /^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i;
140+
var MAX_DIGITS = 22;
141+
var DECIMAL_SEP = '.';
142+
var ZERO_CHAR = '0';
143+
143144
function parse(numStr) {
144-
var parsedNumber = {};
145-
var exponent, i, j, zeros;
145+
var exponent = 0, digits, integerLen;
146+
var e, i, j, zeros;
146147

147148
// Decimal point?
148-
if ((exponent = numStr.indexOf('.')) > -1) {
149-
numStr = numStr.replace('.', '');
149+
if ((e = numStr.indexOf(DECIMAL_SEP)) > -1) {
150+
numStr = numStr.replace(DECIMAL_SEP, '');
150151
}
151152
// Exponential form?
152153
if ((i = numStr.search(/e/i)) > 0) {
153154
// Determine exponent.
154-
if (exponent < 0) {
155-
exponent = i;
156-
}
157-
exponent += +numStr.slice(i + 1);
155+
if (e < 0) e = i;
156+
e += +numStr.slice(i + 1);
158157
numStr = numStr.substring(0, i);
159-
} else if (exponent < 0) {
158+
} else if (e < 0) {
160159
// Integer.
161-
exponent = numStr.length;
160+
e = numStr.length;
162161
}
163162
// Determine leading zeros.
164-
i = 0;
165-
while (numStr.charAt(i) == '0') i++;
163+
for (i = 0; numStr.charAt(i) == ZERO_CHAR; i++);
166164

167165
if (i == (zeros = numStr.length)) {
168166
// Zero.
169-
parsedNumber.digits = [parsedNumber.exponent = 0];
167+
digits = [0];
168+
integerLen = 1;
170169
} else {
171170
// Determine trailing zeros.
172-
do {
173-
zeros--;
174-
} while (numStr.charAt(zeros) == '0');
175-
parsedNumber.exponent = exponent - i - 1;
176-
parsedNumber.digits = [];
171+
while (numStr.charAt(--zeros) == ZERO_CHAR);
172+
integerLen = e - i;
173+
digits = [];
177174
// Convert string to array of digits without leading/trailing zeros.
178-
j = 0;
179-
while (i <= zeros) {
180-
parsedNumber.digits[j++] = +numStr.charAt(i++);
175+
for (j = 0; i <= zeros; i++, j++) {
176+
digits[j] = +numStr.charAt(i);
181177
}
182178
}
183-
return parsedNumber;
179+
180+
// if the overflow the maximum allowed digits then use an exponent
181+
if (integerLen > MAX_DIGITS) {
182+
digits = digits.splice(0, MAX_DIGITS - 1);
183+
exponent = integerLen - 1;
184+
integerLen = 1;
185+
}
186+
187+
return { digits: digits, exponent: exponent, integerLen: integerLen };
184188
}
185189

186190
function roundNumber(parsedNumber, fractionSize, minFrac, maxFrac) {
187191
var digit = 0;
188192
var digits = parsedNumber.digits;
189-
var exponent = parsedNumber.exponent;
190-
var fractionLen = digits.length - 1 - exponent;
193+
var fractionLen = digits.length - parsedNumber.integerLen;
191194

192195
// determine fractionSize if it is not specified
193196
if (isUndefined(fractionSize)) {
194197
fractionSize = Math.min(Math.max(minFrac, fractionLen), maxFrac);
195198
}
196199

197200
// Cut off unwanted digits with rounding
198-
while (fractionLen > fractionSize && digits.length) {
201+
for (; fractionLen > fractionSize && digits.length; fractionLen--) {
199202
digit = digits.pop();
200203
// Round up if necessary
201204
if (digit >= 5) digits[digits.length - 1]++;
202-
fractionLen--;
203205
}
204206

205-
if (digits.length === 0) {
207+
if (!digits.length) {
206208
// We rounded to zero so reset the parsedNumber
207-
parsedNumber.exponent = 0;
209+
parsedNumber.integerLen = 1;
208210
// If the last removed digit was >= 5 then we need to round up
209211
if (digit >= 5) digits.push(1);
210212
// Pad out with the necessary zeros
211213
while (digits.length <= fractionSize) digits.unshift(0);
212214
}
213215

214-
while (fractionLen < fractionSize) {
215-
digits.push(0);
216-
fractionLen++;
217-
}
216+
// Pad out with zeros to get the required fraction length
217+
for (; fractionLen < fractionSize; fractionLen++) digits.push(0);
218218

219219
// Do a final clear of any carrying, e.g. the last digit was rounded up to 10
220220
var carry = digits.reduceRight(function(carry, d, i, digits) {
@@ -224,13 +224,10 @@ function roundNumber(parsedNumber, fractionSize, minFrac, maxFrac) {
224224
}, 0);
225225
if (carry) {
226226
digits.unshift(carry);
227-
parsedNumber.exponent++;
227+
parsedNumber.integerLen++;
228228
}
229229
}
230230

231-
var DECIMAL_SEP = '.';
232-
var MAX_DIGITS = 21;
233-
234231
/**
235232
* Format a number into a string
236233
* @param {number} number The number to format
@@ -252,43 +249,39 @@ var MAX_DIGITS = 21;
252249
function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
253250

254251
if (isObject(number)) return '';
255-
var isInfinity = number === Infinity || number === -Infinity;
256-
if (!isInfinity && !isFinite(number)) return '';
252+
257253
var isNegative = number < 0;
258-
var isZero = false;
259254
number = Math.abs(number);
255+
256+
var isInfinity = number === Infinity;
257+
if (!isInfinity && !isFinite(number)) return '';
258+
259+
var isZero = false;
260260
var numStr = number + '',
261261
formattedText = '',
262-
realExponent = 0,
263262
parsedNumber;
264263

265264
if (isInfinity) {
266265
formattedText = '\u221e';
267266
} else {
268267
parsedNumber = parse(numStr);
269268

270-
if (parsedNumber.exponent > MAX_DIGITS) {
271-
parsedNumber.digits = parsedNumber.digits.splice(0, MAX_DIGITS - 1);
272-
realExponent = parsedNumber.exponent;
273-
parsedNumber.exponent = 0;
274-
}
275-
276269
roundNumber(parsedNumber, fractionSize, pattern.minFrac, pattern.maxFrac);
277270

278271
var digits = parsedNumber.digits;
279-
var exponent = parsedNumber.exponent;
272+
var integerLen = parsedNumber.integerLen;
280273
var decimals = [];
281274
isZero = digits.reduce(function(isZero, d) { return isZero && !d; }, true);
282275

283276
// pad zeros for small numbers
284-
while (exponent < -1) {
277+
while (integerLen < 0) {
285278
digits.unshift(0);
286-
exponent++;
279+
integerLen++;
287280
}
288281

289282
// extract decimals digits
290-
if (exponent >= 0) {
291-
decimals = digits.splice(exponent + 1);
283+
if (integerLen > 0) {
284+
decimals = digits.splice(integerLen);
292285
} else {
293286
decimals = digits;
294287
digits = [0];
@@ -312,8 +305,8 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
312305
formattedText += decimalSep + decimals.join('');
313306
}
314307

315-
if (realExponent) {
316-
formattedText += 'e+' + realExponent;
308+
if (parsedNumber.exponent) {
309+
formattedText += 'e+' + parsedNumber.exponent;
317310
}
318311
}
319312
if (isNegative && !isZero) {
@@ -330,7 +323,7 @@ function padNumber(num, digits, trim) {
330323
num = -num;
331324
}
332325
num = '' + num;
333-
while (num.length < digits) num = '0' + num;
326+
while (num.length < digits) num = ZERO_CHAR + num;
334327
if (trim) {
335328
num = num.substr(num.length - digits);
336329
}

0 commit comments

Comments
 (0)