From 399c3345e0f76f583d830cd7da27518bbb00c91a Mon Sep 17 00:00:00 2001 From: Abel Deuring Date: Fri, 14 Mar 2014 13:22:42 +0100 Subject: [PATCH] Fix bug 1243827: Underscores sometimes removed from string values. --- decode_test.go | 14 ++++++++++++++ resolve.go | 19 +++++++------------ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/decode_test.go b/decode_test.go index 694a11bf..06476e51 100644 --- a/decode_test.go +++ b/decode_test.go @@ -350,6 +350,20 @@ var unmarshalTests = []struct { C inlineB `yaml:",inline"` }{1, inlineB{2, inlineC{3}}}, }, + + // bug 1243827 + { + "a: -b_c", + map[string]interface{}{"a": "-b_c"}, + }, + { + "a: +b_c", + map[string]interface{}{"a": "+b_c"}, + }, + { + "a: 50cent_of_dollar", + map[string]interface{}{"a": "50cent_of_dollar"}, + }, } type inlineB struct { diff --git a/resolve.go b/resolve.go index d4bd532f..dbda017a 100644 --- a/resolve.go +++ b/resolve.go @@ -113,13 +113,8 @@ func resolve(tag string, in string) (rtag string, out interface{}) { case 'D', 'S': // Int, float, or timestamp. - for i := 0; i != len(in); i++ { - if in[i] == '_' { - in = strings.Replace(in, "_", "", -1) - break - } - } - intv, err := strconv.ParseInt(in, 0, 64) + plain := strings.Replace(in, "_", "", -1) + intv, err := strconv.ParseInt(plain, 0, 64) if err == nil { if intv == int64(int(intv)) { return "!!int", int(intv) @@ -127,17 +122,17 @@ func resolve(tag string, in string) (rtag string, out interface{}) { return "!!int", intv } } - floatv, err := strconv.ParseFloat(in, 64) + floatv, err := strconv.ParseFloat(plain, 64) if err == nil { return "!!float", floatv } - if strings.HasPrefix(in, "0b") { - intv, err := strconv.ParseInt(in[2:], 2, 64) + if strings.HasPrefix(plain, "0b") { + intv, err := strconv.ParseInt(plain[2:], 2, 64) if err == nil { return "!!int", int(intv) } - } else if strings.HasPrefix(in, "-0b") { - intv, err := strconv.ParseInt(in[3:], 2, 64) + } else if strings.HasPrefix(plain, "-0b") { + intv, err := strconv.ParseInt(plain[3:], 2, 64) if err == nil { return "!!int", -int(intv) }