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",