fix: parse integer fields as base 10
toInt and toUint passed base 0 to strconv, which infers the base from the literal the way the Go compiler does. A zero-padded CSV field was then read as octal: 08 and 09 failed with invalid syntax and 010 silently parsed as 8. Pass base 10 at both call sites. Go-style prefixed literals such as 0x1f are no longer accepted; they were undocumented and untested, and cannot be kept without keeping the octal reading of 010 as well. Closes #182
This commit is contained in:
1 parent
d083650302
commit
9bc91ef163
3 files changed
+89
-2
No files matched your search
@@ -1359,3 +1359,33 @@ func Test_readTo_inline_nested_struct(t *testing.T) {
|
||||
t.Fatalf("expected \n sample: %v\n got: %v", expected, samples)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUnmarshalZeroPaddedNumbers(t *testing.T) {
|
||||
type row struct {
|
||||
Name string `csv:"name"`
|
||||
Code int `csv:"code"`
|
||||
Count uint `csv:"count"`
|
||||
}
|
||||
|
||||
in := "name,code,count\n" +
|
||||
"a,08,08\n" +
|
||||
"b,09,09\n" +
|
||||
"c,010,010\n" +
|
||||
"d,007,007\n"
|
||||
|
||||
var got []row
|
||||
if err := UnmarshalString(in, &got); err != nil {
|
||||
t.Fatalf("UnmarshalString failed on zero-padded numbers: %s", err)
|
||||
}
|
||||
|
||||
want := []row{
|
||||
{Name: "a", Code: 8, Count: 8},
|
||||
{Name: "b", Code: 9, Count: 9},
|
||||
{Name: "c", Code: 10, Count: 10},
|
||||
{Name: "d", Code: 7, Count: 7},
|
||||
}
|
||||
|
||||
if !reflect.DeepEqual(got, want) {
|
||||
t.Errorf("UnmarshalString returned %+v, want %+v", got, want)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user