internal/number: improve conformance

- Use patterns also for Inf
- Allow zero precision (and thus an empty result)
  CLDR patterns don’t allow specifying this, but
  fmt pattrens do. We allow it by means of extension.
- Support AlwaysSign flag in case negative patterns
  aren’t specified. This allows passing fmt flag
  behavior for most default Decimal and Scientific
  formats.

Change-Id: I22104a92e12da11465584eaab9ffd8320a1f469d
Reviewed-on: https://go-review.googlesource.com/46290
Run-TryBot: Marcel van Lohuizen <mpvl@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Nigel Tao <nigeltao@golang.org>
diff --git a/internal/number/format.go b/internal/number/format.go
index 6cb243c..12553b6 100755
--- a/internal/number/format.go
+++ b/internal/number/format.go
@@ -238,12 +238,6 @@
 	for ; trailZero > 0; trailZero-- {
 		dst = f.AppendDigit(dst, 0)
 	}
-	// Ensure that at least one digit is written no matter what. This makes
-	// things more robust, even though a pattern should always require at least
-	// one fraction or integer digit.
-	if len(dst) == savedLen {
-		dst = f.AppendDigit(dst, 0)
-	}
 	return appendAffix(dst, f, suffix, neg), savedLen, len(dst)
 }
 
@@ -325,12 +319,6 @@
 	for ; trailZero > 0; trailZero-- {
 		dst = f.AppendDigit(dst, 0)
 	}
-	// Ensure that at least one digit is written no matter what. This makes
-	// things more robust, even though a pattern should always require at least
-	// one fraction or integer digit.
-	if len(dst) == savedLen {
-		dst = f.AppendDigit(dst, 0)
-	}
 
 	// exp
 	buf := [12]byte{}
@@ -411,8 +399,11 @@
 		sufStart := 1 + str[0]
 		affix = str[1:sufStart]
 		suffix = str[sufStart+1:]
-	} else if neg {
-		affix = "-"
+	}
+	// TODO: introduce a NeedNeg sign to indicate if the left pattern already
+	// has a sign marked?
+	if f.NegOffset == 0 && (neg || f.Flags&AlwaysSign != 0) {
+		affix = "-" + affix
 	}
 	return affix, suffix
 }
@@ -432,10 +423,11 @@
 }
 
 func fmtInfinite(dst []byte, f *Formatter, d *Decimal) []byte {
-	if d.Neg {
-		dst = append(dst, f.Symbol(SymMinusSign)...)
-	}
-	return append(dst, f.Symbol(SymInfinity)...)
+	affix, suffix := f.getAffixes(d.Neg)
+	dst = appendAffix(dst, f, affix, d.Neg)
+	dst = append(dst, f.Symbol(SymInfinity)...)
+	dst = appendAffix(dst, f, suffix, d.Neg)
+	return dst
 }
 
 func appendAffix(dst []byte, f *Formatter, affix string, neg bool) []byte {
diff --git a/internal/number/format_test.go b/internal/number/format_test.go
index d7b65b0..47e907c 100755
--- a/internal/number/format_test.go
+++ b/internal/number/format_test.go
@@ -36,7 +36,7 @@
 			"-Inf": "-∞",
 		},
 	}, {
-		pattern: "+0",
+		pattern: "+0;+0",
 		test: pairs{
 			"0":    "+0",
 			"1":    "+1",
@@ -47,9 +47,10 @@
 			"1.2":  "+1",
 			"NaN":  "NaN",
 			"-Inf": "-∞",
+			"Inf":  "+∞",
 		},
 	}, {
-		pattern: "0 +",
+		pattern: "0 +;0 +",
 		test: pairs{
 			"0":   "0 +",
 			"1":   "1 +",
@@ -59,7 +60,10 @@
 	}, {
 		pattern: "0;0-",
 		test: pairs{
-			"-1": "1-",
+			"-1":   "1-",
+			"NaN":  "NaN",
+			"-Inf": "∞-",
+			"Inf":  "∞",
 		},
 	}, {
 		pattern: "0000",
@@ -161,15 +165,15 @@
 	}, {
 		pattern: "#",
 		test: pairs{
-			".00": "0",
-			"0":   "0",
+			".00": "", // This is the behavior of fmt.
+			"0":   "", // This is the behavior of fmt.
 			"1":   "1",
 			"10.": "10",
 		},
 	}, {
 		pattern: ".#",
 		test: pairs{
-			"0":      "0",
+			"0":      "", // This is the behavior of fmt.
 			"1":      "1",
 			"1.2":    "1.2",
 			"1.2345": "1.2",
@@ -315,7 +319,7 @@
 			"0.001": "1\u202f×\u202f10⁻⁰³",
 		},
 	}, {
-		pattern: "*x###",
+		pattern: "*x##0",
 		test: pairs{
 			"0":    "xx0",
 			"10":   "x10",
@@ -323,7 +327,7 @@
 			"1000": "1000",
 		},
 	}, {
-		pattern: "###*x",
+		pattern: "##0*x",
 		test: pairs{
 			"0":    "0xx",
 			"10":   "10x",
@@ -353,13 +357,13 @@
 			"10000": "***1.0\u202f×\u202f10⁰⁴",
 		},
 	}, {
-		pattern: "*xpre#suf",
+		pattern: "*xpre0suf",
 		test: pairs{
 			"0":  "pre0suf",
 			"10": "pre10suf",
 		},
 	}, {
-		pattern: "*∞ pre #### suf",
+		pattern: "*∞ pre ###0 suf",
 		test: pairs{
 			"0":    "∞∞∞ pre 0 suf",
 			"10":   "∞∞ pre 10 suf",
@@ -367,7 +371,7 @@
 			"1000": " pre 1000 suf",
 		},
 	}, {
-		pattern: "pre *∞#### suf",
+		pattern: "pre *∞###0 suf",
 		test: pairs{
 			"0":    "pre ∞∞∞0 suf",
 			"10":   "pre ∞∞10 suf",
@@ -375,7 +379,7 @@
 			"1000": "pre 1000 suf",
 		},
 	}, {
-		pattern: "pre ####*∞ suf",
+		pattern: "pre ###0*∞ suf",
 		test: pairs{
 			"0":    "pre 0∞∞∞ suf",
 			"10":   "pre 10∞∞ suf",
@@ -383,7 +387,7 @@
 			"1000": "pre 1000 suf",
 		},
 	}, {
-		pattern: "pre #### suf *∞",
+		pattern: "pre ###0 suf *∞",
 		test: pairs{
 			"0":    "pre 0 suf ∞∞∞",
 			"10":   "pre 10 suf ∞∞",
@@ -392,7 +396,7 @@
 		},
 	}, {
 		// Take width of positive pattern.
-		pattern: "**####;**-######x",
+		pattern: "**###0;**-#####0x",
 		test: pairs{
 			"0":  "***0",
 			"-1": "*-1x",