1
0
mirror of https://github.com/golang/go synced 2024-11-22 00:24:41 -07:00

fmt.Scan: scan binary-exponent floating format, 2.4p-3

R=rsc, rog, r2
CC=golang-dev
https://golang.org/cl/4128049
This commit is contained in:
Rob Pike 2011-02-02 12:38:48 -08:00
parent bc874ec0dd
commit 029bbe18e0
2 changed files with 28 additions and 2 deletions

View File

@ -7,6 +7,7 @@ package fmt
import (
"bytes"
"io"
"math"
"os"
"reflect"
"strconv"
@ -459,7 +460,7 @@ const (
hexadecimalDigits = "0123456789aAbBcCdDeEfF"
sign = "+-"
period = "."
exponent = "eE"
exponent = "eEp"
)
// getBase returns the numeric base represented by the verb and its digit string.
@ -617,6 +618,27 @@ func (s *ss) complexTokens() (real, imag string) {
// convertFloat converts the string to a float64value.
func (s *ss) convertFloat(str string, n int) float64 {
if p := strings.Index(str, "p"); p >= 0 {
// Atof doesn't handle power-of-2 exponents,
// but they're easy to evaluate.
f, err := strconv.AtofN(str[:p], n)
if err != nil {
// Put full string into error.
if e, ok := err.(*strconv.NumError); ok {
e.Num = str
}
s.error(err)
}
n, err := strconv.Atoi(str[p+1:])
if err != nil {
// Put full string into error.
if e, ok := err.(*strconv.NumError); ok {
e.Num = str
}
s.error(err)
}
return math.Ldexp(f, n)
}
f, err := strconv.AtofN(str, n)
if err != nil {
s.error(err)
@ -747,7 +769,7 @@ func (s *ss) hexString() string {
return s.buf.String()
}
const floatVerbs = "eEfFgGv"
const floatVerbs = "beEfFgGv"
// scanOne scans a single value, deriving the scanner from the type of the argument.
func (s *ss) scanOne(verb int, field interface{}) {

View File

@ -160,6 +160,10 @@ var scanTests = []ScanTest{
{"2.3\n", &float64Val, 2.3},
{"2.3e1\n", &float32Val, float32(2.3e1)},
{"2.3e2\n", &float64Val, 2.3e2},
{"2.3p2\n", &float64Val, 2.3 * 4},
{"2.3p+2\n", &float64Val, 2.3 * 4},
{"2.3p+66\n", &float64Val, 2.3 * (1 << 32) * (1 << 32) * 4},
{"2.3p-66\n", &float64Val, 2.3 / ((1 << 32) * (1 << 32) * 4)},
{"2.35\n", &stringVal, "2.35"},
{"2345678\n", &bytesVal, []byte("2345678")},
{"(3.4e1-2i)\n", &complex128Val, 3.4e1 - 2i},