Merge pull request #3 from adeuring/1243827

Fix LP bug 1243827
diff --git a/decode_test.go b/decode_test.go
index 0a533b1..80af1ed 100644
--- a/decode_test.go
+++ b/decode_test.go
@@ -350,6 +350,20 @@
 			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 d4bd532..dbda017 100644
--- a/resolve.go
+++ b/resolve.go
@@ -113,13 +113,8 @@
 
 	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 @@
 				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)
 			}