@@ -124,8 +124,6 @@ function currencyFilter($locale) {
124
124
</file>
125
125
</example>
126
126
*/
127
-
128
-
129
127
numberFilter . $inject = [ '$locale' ] ;
130
128
function numberFilter ( $locale ) {
131
129
var formats = $locale . NUMBER_FORMATS ;
@@ -139,82 +137,84 @@ function numberFilter($locale) {
139
137
} ;
140
138
}
141
139
142
- var isValid = / ^ - ? ( \d + ( \. \d * ) ? | \. \d + ) ( e [ + - ] ? \d + ) ? $ / i;
140
+ var MAX_DIGITS = 22 ;
141
+ var DECIMAL_SEP = '.' ;
142
+ var ZERO_CHAR = '0' ;
143
+
143
144
function parse ( numStr ) {
144
- var parsedNumber = { } ;
145
- var exponent , i , j , zeros ;
145
+ var exponent = 0 , digits , integerLen ;
146
+ var e , i , j , zeros ;
146
147
147
148
// 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 , '' ) ;
150
151
}
151
152
// Exponential form?
152
153
if ( ( i = numStr . search ( / e / i) ) > 0 ) {
153
154
// 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 ) ;
158
157
numStr = numStr . substring ( 0 , i ) ;
159
- } else if ( exponent < 0 ) {
158
+ } else if ( e < 0 ) {
160
159
// Integer.
161
- exponent = numStr . length ;
160
+ e = numStr . length ;
162
161
}
163
162
// Determine leading zeros.
164
- i = 0 ;
165
- while ( numStr . charAt ( i ) == '0' ) i ++ ;
163
+ for ( i = 0 ; numStr . charAt ( i ) == ZERO_CHAR ; i ++ ) ;
166
164
167
165
if ( i == ( zeros = numStr . length ) ) {
168
166
// Zero.
169
- parsedNumber . digits = [ parsedNumber . exponent = 0 ] ;
167
+ digits = [ 0 ] ;
168
+ integerLen = 1 ;
170
169
} else {
171
170
// 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 = [ ] ;
177
174
// 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 ) ;
181
177
}
182
178
}
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 } ;
184
188
}
185
189
186
190
function roundNumber ( parsedNumber , fractionSize , minFrac , maxFrac ) {
187
191
var digit = 0 ;
188
192
var digits = parsedNumber . digits ;
189
- var exponent = parsedNumber . exponent ;
190
- var fractionLen = digits . length - 1 - exponent ;
193
+ var fractionLen = digits . length - parsedNumber . integerLen ;
191
194
192
195
// determine fractionSize if it is not specified
193
196
if ( isUndefined ( fractionSize ) ) {
194
197
fractionSize = Math . min ( Math . max ( minFrac , fractionLen ) , maxFrac ) ;
195
198
}
196
199
197
200
// Cut off unwanted digits with rounding
198
- while ( fractionLen > fractionSize && digits . length ) {
201
+ for ( ; fractionLen > fractionSize && digits . length ; fractionLen -- ) {
199
202
digit = digits . pop ( ) ;
200
203
// Round up if necessary
201
204
if ( digit >= 5 ) digits [ digits . length - 1 ] ++ ;
202
- fractionLen -- ;
203
205
}
204
206
205
- if ( digits . length === 0 ) {
207
+ if ( ! digits . length ) {
206
208
// We rounded to zero so reset the parsedNumber
207
- parsedNumber . exponent = 0 ;
209
+ parsedNumber . integerLen = 1 ;
208
210
// If the last removed digit was >= 5 then we need to round up
209
211
if ( digit >= 5 ) digits . push ( 1 ) ;
210
212
// Pad out with the necessary zeros
211
213
while ( digits . length <= fractionSize ) digits . unshift ( 0 ) ;
212
214
}
213
215
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 ) ;
218
218
219
219
// Do a final clear of any carrying, e.g. the last digit was rounded up to 10
220
220
var carry = digits . reduceRight ( function ( carry , d , i , digits ) {
@@ -224,13 +224,10 @@ function roundNumber(parsedNumber, fractionSize, minFrac, maxFrac) {
224
224
} , 0 ) ;
225
225
if ( carry ) {
226
226
digits . unshift ( carry ) ;
227
- parsedNumber . exponent ++ ;
227
+ parsedNumber . integerLen ++ ;
228
228
}
229
229
}
230
230
231
- var DECIMAL_SEP = '.' ;
232
- var MAX_DIGITS = 21 ;
233
-
234
231
/**
235
232
* Format a number into a string
236
233
* @param {number } number The number to format
@@ -252,43 +249,39 @@ var MAX_DIGITS = 21;
252
249
function formatNumber ( number , pattern , groupSep , decimalSep , fractionSize ) {
253
250
254
251
if ( isObject ( number ) ) return '' ;
255
- var isInfinity = number === Infinity || number === - Infinity ;
256
- if ( ! isInfinity && ! isFinite ( number ) ) return '' ;
252
+
257
253
var isNegative = number < 0 ;
258
- var isZero = false ;
259
254
number = Math . abs ( number ) ;
255
+
256
+ var isInfinity = number === Infinity ;
257
+ if ( ! isInfinity && ! isFinite ( number ) ) return '' ;
258
+
259
+ var isZero = false ;
260
260
var numStr = number + '' ,
261
261
formattedText = '' ,
262
- realExponent = 0 ,
263
262
parsedNumber ;
264
263
265
264
if ( isInfinity ) {
266
265
formattedText = '\u221e' ;
267
266
} else {
268
267
parsedNumber = parse ( numStr ) ;
269
268
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
-
276
269
roundNumber ( parsedNumber , fractionSize , pattern . minFrac , pattern . maxFrac ) ;
277
270
278
271
var digits = parsedNumber . digits ;
279
- var exponent = parsedNumber . exponent ;
272
+ var integerLen = parsedNumber . integerLen ;
280
273
var decimals = [ ] ;
281
274
isZero = digits . reduce ( function ( isZero , d ) { return isZero && ! d ; } , true ) ;
282
275
283
276
// pad zeros for small numbers
284
- while ( exponent < - 1 ) {
277
+ while ( integerLen < 0 ) {
285
278
digits . unshift ( 0 ) ;
286
- exponent ++ ;
279
+ integerLen ++ ;
287
280
}
288
281
289
282
// extract decimals digits
290
- if ( exponent >= 0 ) {
291
- decimals = digits . splice ( exponent + 1 ) ;
283
+ if ( integerLen > 0 ) {
284
+ decimals = digits . splice ( integerLen ) ;
292
285
} else {
293
286
decimals = digits ;
294
287
digits = [ 0 ] ;
@@ -312,8 +305,8 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
312
305
formattedText += decimalSep + decimals . join ( '' ) ;
313
306
}
314
307
315
- if ( realExponent ) {
316
- formattedText += 'e+' + realExponent ;
308
+ if ( parsedNumber . exponent ) {
309
+ formattedText += 'e+' + parsedNumber . exponent ;
317
310
}
318
311
}
319
312
if ( isNegative && ! isZero ) {
@@ -330,7 +323,7 @@ function padNumber(num, digits, trim) {
330
323
num = - num ;
331
324
}
332
325
num = '' + num ;
333
- while ( num . length < digits ) num = '0' + num ;
326
+ while ( num . length < digits ) num = ZERO_CHAR + num ;
334
327
if ( trim ) {
335
328
num = num . substr ( num . length - digits ) ;
336
329
}
0 commit comments