mirror of
https://github.com/golang/go
synced 2024-11-23 21:40:05 -07:00
strconv: fix for parseFloatPrefix
parseFloatPrefix accepts a string if it has a valid floating-point number as prefix. Make sure that "infi", "infin", ... etc. are accepted as valid numbers "inf" with suffix "i", "in", etc. This is important for parsing complex numbers such as "0+infi". This change does not affect the correctness of ParseFloat because ParseFloat rejects strings that contain a suffix after a valid floating-point number. Updates #36771. Change-Id: Ie1693a8ca2f8edf07b57688e0b35751b7100d39d Reviewed-on: https://go-review.googlesource.com/c/go/+/231237 Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
0f8fecaba7
commit
8740bdc5af
@ -55,7 +55,11 @@ func special(s string) (f float64, n int, ok bool) {
|
|||||||
fallthrough
|
fallthrough
|
||||||
case 'i', 'I':
|
case 'i', 'I':
|
||||||
n := commonPrefixLenIgnoreCase(s, "infinity")
|
n := commonPrefixLenIgnoreCase(s, "infinity")
|
||||||
// both "inf" and "infinity" are ok
|
// Anything longer than "inf" is ok, but if we
|
||||||
|
// don't have "infinity", only consume "inf".
|
||||||
|
if 3 < n && n < 8 {
|
||||||
|
n = 3
|
||||||
|
}
|
||||||
if n == 3 || n == 8 {
|
if n == 3 || n == 8 {
|
||||||
return math.Inf(sign), nsign + n, true
|
return math.Inf(sign), nsign + n, true
|
||||||
}
|
}
|
||||||
|
@ -486,8 +486,9 @@ func TestParseFloatPrefix(t *testing.T) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// Adding characters that do not extend a number should not invalidate it.
|
// Adding characters that do not extend a number should not invalidate it.
|
||||||
// Test a few.
|
// Test a few. The "i" and "init" cases test that we accept "infi", "infinit"
|
||||||
for _, suffix := range []string{" ", "q", "+", "-", "<", "=", ">", "(", ")"} {
|
// correctly as "inf" with suffix.
|
||||||
|
for _, suffix := range []string{" ", "q", "+", "-", "<", "=", ">", "(", ")", "i", "init"} {
|
||||||
in := test.in + suffix
|
in := test.in + suffix
|
||||||
_, n, err := ParseFloatPrefix(in, 64)
|
_, n, err := ParseFloatPrefix(in, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user