@@ -174,40 +174,54 @@ pub fn parse_number(s: &[u8], fmt: FloatFormat) -> Option<(Number, usize)> {
174174 }
175175 }
176176
177+ let len = s. offset_from ( & start) as _ ;
178+
177179 // handle uncommon case with many digits
178- let mut many_digits = false ;
179180 n_digits -= 19 ;
181+ if n_digits <= 0 {
182+ return Some ( (
183+ Number {
184+ exponent,
185+ mantissa,
186+ negative,
187+ many_digits : false ,
188+ } ,
189+ len,
190+ ) ) ;
191+ }
192+
193+ let mut many_digits = false ;
194+ let mut p = digits_start;
195+ while p. check_first_either ( b'0' , b'.' ) {
196+ n_digits -= p. first ( ) . saturating_sub ( b'0' - 1 ) as isize ; // '0' = b'.' + 2
197+ p. step ( ) ;
198+ }
180199 if n_digits > 0 {
181- let mut p = digits_start ;
182- while p . check_first_either ( b'0' , b'.' ) {
183- n_digits -= p . first ( ) . saturating_sub ( b'0' - 1 ) as isize ; // '0' = b'.' + 2
184- p . step ( ) ;
185- }
186- if n_digits > 0 {
187- // at this point we have more than 19 significant digits, let's try again
188- many_digits = true ;
189- mantissa = 0u64 ;
190- let mut s = digits_start ;
200+ // at this point we have more than 19 significant digits, let's try again
201+ many_digits = true ;
202+ mantissa = 0u64 ;
203+ let mut s = digits_start ;
204+ try_parse_19digits ( & mut s , & mut mantissa ) ;
205+ exponent = if mantissa >= MIN_19DIGIT_INT {
206+ int_end . offset_from ( & s ) // big int
207+ } else {
208+ s . step ( ) ; // fractional component, skip the '.'
209+ let before = s ;
191210 try_parse_19digits ( & mut s, & mut mantissa) ;
192- exponent = if mantissa >= MIN_19DIGIT_INT {
193- int_end. offset_from ( & s) // big int
194- } else {
195- s. step ( ) ; // fractional component, skip the '.'
196- let before = s;
197- try_parse_19digits ( & mut s, & mut mantissa) ;
198- -s. offset_from ( & before)
199- } as i64 ;
200- exponent += exp_number; // add back the explicit part
201- }
211+ -s. offset_from ( & before)
212+ } as i64 ;
213+ exponent += exp_number; // add back the explicit part
202214 }
203215
204- let number = Number {
205- exponent,
206- mantissa,
207- negative,
208- many_digits,
209- } ;
210- Some ( ( number, s. offset_from ( & start) as usize ) )
216+ Some ( (
217+ Number {
218+ exponent,
219+ mantissa,
220+ negative,
221+ many_digits,
222+ } ,
223+ len,
224+ ) )
211225}
212226
213227#[ inline]
0 commit comments