diff --git a/integer.go b/integer.go index dd7636b..74a764f 100644 --- a/integer.go +++ b/integer.go @@ -59,20 +59,20 @@ func parseNumber(s *scanner) (interface{}, error) { ) for s.off < len(s.data) { - size := s.off - start - if (t == typeInteger && (size >= 15)) || size >= 16 { - return 0, &UnmarshalError{s.off, ErrNumberOutOfRange} - } - c := s.data[s.off] if isDigit(c) { s.off++ + // The length limit applies to the consumed digits, not to the delimiter that follows them. + if size := s.off - start; (t == typeInteger && size > 15) || size > 16 { + return 0, &UnmarshalError{s.off, ErrNumberOutOfRange} + } + continue } if t == typeInteger && c == '.' { - if size > maxDigit { + if s.off-start > maxDigit { return 0, &UnmarshalError{s.off, ErrNumberOutOfRange} } diff --git a/integer_test.go b/integer_test.go index 099e2b9..26a1ff0 100644 --- a/integer_test.go +++ b/integer_test.go @@ -59,6 +59,8 @@ func TestParseIntegerOrDecimal(t *testing.T) { {"10.", 0, true}, {"10.1234", 0, true}, {"-", 0, true}, + {"123456789012345, 1", int64(123456789012345), false}, + {"123456789012.123, 1.1", 123456789012.123, false}, {"1234567890123456", 0, true}, {"123456789012345.6", 0, true}, {"1234567890123.", 0, true},