Copyright 2018 The Go Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.

package json

import (
	
	
)
parseNumber reads the given []byte for a valid JSON number. If it is valid, it returns the number of bytes. Parsing logic follows the definition in https://tools.ietf.org/html/rfc7159#section-6, and is based off encoding/json.isValidNumber function.
func ( []byte) (int, bool) {
	var  int

	 := 
	if len() == 0 {
		return 0, false
	}
Optional -
	if [0] == '-' {
		 = [1:]
		++
		if len() == 0 {
			return 0, false
		}
	}
Digits
	switch {
	case [0] == '0':
		 = [1:]
		++

	case '1' <= [0] && [0] <= '9':
		 = [1:]
		++
		for len() > 0 && '0' <= [0] && [0] <= '9' {
			 = [1:]
			++
		}

	default:
		return 0, false
	}
. followed by 1 or more digits.
	if len() >= 2 && [0] == '.' && '0' <= [1] && [1] <= '9' {
		 = [2:]
		 += 2
		for len() > 0 && '0' <= [0] && [0] <= '9' {
			 = [1:]
			++
		}
	}
e or E followed by an optional - or + and 1 or more digits.
	if len() >= 2 && ([0] == 'e' || [0] == 'E') {
		 = [1:]
		++
		if [0] == '+' || [0] == '-' {
			 = [1:]
			++
			if len() == 0 {
				return 0, false
			}
		}
		for len() > 0 && '0' <= [0] && [0] <= '9' {
			 = [1:]
			++
		}
	}
Check that next byte is a delimiter or it is at the end.
	if  < len() && isNotDelim([]) {
		return 0, false
	}

	return , true
}
numberParts is the result of parsing out a valid JSON number. It contains the parts of a number. The parts are used for integer conversion.
type numberParts struct {
	neg  bool
	intp []byte
	frac []byte
	exp  []byte
}
parseNumber constructs numberParts from given []byte. The logic here is similar to consumeNumber above with the difference of having to construct numberParts. The slice fields in numberParts are subslices of the input.
func ( []byte) (numberParts, bool) {
	var  bool
	var  []byte
	var  []byte
	var  []byte

	 := 
	if len() == 0 {
		return numberParts{}, false
	}
Optional -
	if [0] == '-' {
		 = true
		 = [1:]
		if len() == 0 {
			return numberParts{}, false
		}
	}
Digits
	switch {
Skip first 0 and no need to store.
		 = [1:]

	case '1' <= [0] && [0] <= '9':
		 = 
		 := 1
		 = [1:]
		for len() > 0 && '0' <= [0] && [0] <= '9' {
			 = [1:]
			++
		}
		 = [:]

	default:
		return numberParts{}, false
	}
. followed by 1 or more digits.
	if len() >= 2 && [0] == '.' && '0' <= [1] && [1] <= '9' {
		 = [1:]
		 := 1
		 = [2:]
		for len() > 0 && '0' <= [0] && [0] <= '9' {
			 = [1:]
			++
		}
		 = [:]
	}
e or E followed by an optional - or + and 1 or more digits.
	if len() >= 2 && ([0] == 'e' || [0] == 'E') {
		 = [1:]
		 = 
		 := 0
		if [0] == '+' || [0] == '-' {
			 = [1:]
			++
			if len() == 0 {
				return numberParts{}, false
			}
		}
		for len() > 0 && '0' <= [0] && [0] <= '9' {
			 = [1:]
			++
		}
		 = [:]
	}

	return numberParts{
		neg:  ,
		intp: ,
		frac: bytes.TrimRight(, "0"), // Remove unnecessary 0s to the right.
		exp:  ,
	}, true
}
normalizeToIntString returns an integer string in normal form without the E-notation for given numberParts. It will return false if it is not an integer or if the exponent exceeds than max/min int value.
func ( numberParts) (string, bool) {
	 := len(.intp)
	 := len(.frac)

	if  == 0 &&  == 0 {
		return "0", true
	}

	var  int
	if len(.exp) > 0 {
		,  := strconv.ParseInt(string(.exp), 10, 32)
		if  != nil {
			return "", false
		}
		 = int()
	}

	var  []byte
For positive E, shift fraction digits into integer part and also pad with zeroes as needed.
If there are more digits in fraction than the E value, then the number is not an integer.
		if  >  {
			return "", false
		}
Make sure resulting digits are within max value limit to avoid unnecessarily constructing a large byte slice that may simply fail later on.
		const  = 20 // Max uint64 value has 20 decimal digits.
		if + >  {
			return "", false
		}
Set cap to make a copy of integer part when appended.
		 = .intp[:len(.intp):len(.intp)]
		 = append(, .frac...)
		for  := 0;  < -; ++ {
			 = append(, '0')
		}
For negative E, shift digits in integer part out.
If there are fractions, then the number is not an integer.
		if  > 0 {
			return "", false
		}
index is where the decimal point will be after adjusting for negative exponent.
		 :=  + 
		if  < 0 {
			return "", false
		}

If any of the digits being shifted to the right of the decimal point is non-zero, then the number is not an integer.
		for  := ;  < ; ++ {
			if [] != '0' {
				return "", false
			}
		}
		 = [:]
	}

	if .neg {
		return "-" + string(), true
	}
	return string(), true