// Strings to integers
{s: "255", d: &scanuint8, wantuint: 255},
- {s: "256", d: &scanuint8, wanterr: `converting string "256" to a uint8: parsing "256": value out of range`},
+ {s: "256", d: &scanuint8, wanterr: `converting string "256" to a uint8: strconv.ParseUint: parsing "256": value out of range`},
{s: "256", d: &scanuint16, wantuint: 256},
{s: "-1", d: &scanint, wantint: -1},
- {s: "foo", d: &scanint, wanterr: `converting string "foo" to a int: parsing "foo": invalid syntax`},
+ {s: "foo", d: &scanint, wanterr: `converting string "foo" to a int: strconv.ParseInt: parsing "foo": invalid syntax`},
// True bools
{s: true, d: &scanbool, wantbool: true},
case "0", "f", "F", "false", "FALSE", "False":
return false, nil
}
- return false, &NumError{str, ErrSyntax}
+ return false, syntaxError("ParseBool", str)
}
// FormatBool returns "true" or "false" according to the value of b
return
}
+const fnParseFloat = "ParseFloat"
+
func atof32(s string) (f float32, err error) {
if val, ok := special(s); ok {
return float32(val), nil
var d decimal
if !d.set(s) {
- return 0, &NumError{s, ErrSyntax}
+ return 0, syntaxError(fnParseFloat, s)
}
if optimize {
if f, ok := d.atof32(); ok {
b, ovf := d.floatBits(&float32info)
f = math.Float32frombits(uint32(b))
if ovf {
- err = &NumError{s, ErrRange}
+ err = rangeError(fnParseFloat, s)
}
return f, err
}
var d decimal
if !d.set(s) {
- return 0, &NumError{s, ErrSyntax}
+ return 0, syntaxError(fnParseFloat, s)
}
if optimize {
if f, ok := d.atof64(); ok {
b, ovf := d.floatBits(&float64info)
f = math.Float64frombits(b)
if ovf {
- err = &NumError{s, ErrRange}
+ err = rangeError(fnParseFloat, s)
}
return f, err
}
for i := range atoftests {
test := &atoftests[i]
if test.err != nil {
- test.err = &NumError{test.in, test.err}
+ test.err = &NumError{"ParseFloat", test.in, test.err}
}
}
}
// A NumError records a failed conversion.
type NumError struct {
- Num string // the input
- Err error // the reason the conversion failed (ErrRange, ErrSyntax)
+ Func string // the failing function (ParseBool, ParseInt, ParseUint, ParseFloat)
+ Num string // the input
+ Err error // the reason the conversion failed (ErrRange, ErrSyntax)
}
-func (e *NumError) Error() string { return `parsing "` + e.Num + `": ` + e.Err.Error() }
+func (e *NumError) Error() string {
+ return "strconv." + e.Func + ": " + `parsing "` + e.Num + `": ` + e.Err.Error()
+}
+
+func syntaxError(fn, str string) *NumError {
+ return &NumError{fn, str, ErrSyntax}
+}
+
+func rangeError(fn, str string) *NumError {
+ return &NumError{fn, str, ErrRange}
+}
const intSize = 32 << uint(^uint(0)>>63)
return n, nil
Error:
- return n, &NumError{s0, err}
+ return n, &NumError{"ParseUint", s0, err}
}
// ParseInt interprets a string s in the given base (2 to 36) and
// to s cannot be represented by a signed integer of the
// given size, err.Error = ErrRange.
func ParseInt(s string, base int, bitSize int) (i int64, err error) {
+ const fnParseInt = "ParseInt"
+
if bitSize == 0 {
bitSize = int(IntSize)
}
// Empty string bad.
if len(s) == 0 {
- return 0, &NumError{s, ErrSyntax}
+ return 0, syntaxError(fnParseInt, s)
}
// Pick off leading sign.
var un uint64
un, err = ParseUint(s, base, bitSize)
if err != nil && err.(*NumError).Err != ErrRange {
+ err.(*NumError).Func = fnParseInt
err.(*NumError).Num = s0
return 0, err
}
cutoff := uint64(1 << uint(bitSize-1))
if !neg && un >= cutoff {
- return int64(cutoff - 1), &NumError{s0, ErrRange}
+ return int64(cutoff - 1), rangeError(fnParseInt, s0)
}
if neg && un > cutoff {
- return -int64(cutoff), &NumError{s0, ErrRange}
+ return -int64(cutoff), rangeError(fnParseInt, s0)
}
n := int64(un)
if neg {
for i := range atoui64tests {
test := &atoui64tests[i]
if test.err != nil {
- test.err = &NumError{test.in, test.err}
+ test.err = &NumError{"ParseUint", test.in, test.err}
}
}
for i := range btoui64tests {
test := &btoui64tests[i]
if test.err != nil {
- test.err = &NumError{test.in, test.err}
+ test.err = &NumError{"ParseUint", test.in, test.err}
}
}
for i := range atoi64tests {
test := &atoi64tests[i]
if test.err != nil {
- test.err = &NumError{test.in, test.err}
+ test.err = &NumError{"ParseInt", test.in, test.err}
}
}
for i := range btoi64tests {
test := &btoi64tests[i]
if test.err != nil {
- test.err = &NumError{test.in, test.err}
+ test.err = &NumError{"ParseInt", test.in, test.err}
}
}
for i := range atoui32tests {
test := &atoui32tests[i]
if test.err != nil {
- test.err = &NumError{test.in, test.err}
+ test.err = &NumError{"ParseUint", test.in, test.err}
}
}
for i := range atoi32tests {
test := &atoi32tests[i]
if test.err != nil {
- test.err = &NumError{test.in, test.err}
+ test.err = &NumError{"ParseInt", test.in, test.err}
}
}
}