x/text: fix scientific notation by removing extraneous spaces The existing implementation adds extraneous spaces around the superscriptingExponent. This is different from what ICU4C does. It also turns out adding those extra spaces messes with other padding calculations. Fixes golang/go#71428 Change-Id: Id6702390dc40c17bdd5dff2597aa8e1044f5768e Reviewed-on: https://go-review.googlesource.com/c/text/+/644121 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Sean Liao <sean@liao.dev> Auto-Submit: Sean Liao <sean@liao.dev> Reviewed-by: Tristan Swadell <tswadell@google.com>
diff --git a/internal/number/format.go b/internal/number/format.go index cd94c5d..1aadcf4 100644 --- a/internal/number/format.go +++ b/internal/number/format.go
@@ -394,9 +394,7 @@ exp := n.Exp - int32(n.Comma) exponential := f.Symbol(SymExponential) if exponential == "E" { - dst = append(dst, "\u202f"...) // NARROW NO-BREAK SPACE dst = append(dst, f.Symbol(SymSuperscriptingExponent)...) - dst = append(dst, "\u202f"...) // NARROW NO-BREAK SPACE dst = f.AppendDigit(dst, 1) dst = f.AppendDigit(dst, 0) switch {
diff --git a/internal/number/format_test.go b/internal/number/format_test.go index 01a0894..77ccdaa 100644 --- a/internal/number/format_test.go +++ b/internal/number/format_test.go
@@ -271,63 +271,63 @@ }, { pattern: "#E0", test: pairs{ - "0": "0\u202f×\u202f10⁰", - "1": "1\u202f×\u202f10⁰", - "123.456": "1\u202f×\u202f10²", + "0": "0×10⁰", + "1": "1×10⁰", + "123.456": "1×10²", }, }, { pattern: "#E+0", test: pairs{ - "0": "0\u202f×\u202f10⁺⁰", - "1000": "1\u202f×\u202f10⁺³", - "1E100": "1\u202f×\u202f10⁺¹⁰⁰", - "1E-100": "1\u202f×\u202f10⁻¹⁰⁰", + "0": "0×10⁺⁰", + "1000": "1×10⁺³", + "1E100": "1×10⁺¹⁰⁰", + "1E-100": "1×10⁻¹⁰⁰", "NaN": "NaN", "-Inf": "-∞", }, }, { pattern: "##0E00", test: pairs{ - "100": "100\u202f×\u202f10⁰⁰", - "12345": "12\u202f×\u202f10⁰³", - "123.456": "123\u202f×\u202f10⁰⁰", + "100": "100×10⁰⁰", + "12345": "12×10⁰³", + "123.456": "123×10⁰⁰", }, }, { pattern: "##0.###E00", test: pairs{ - "100": "100\u202f×\u202f10⁰⁰", - "12345": "12.345\u202f×\u202f10⁰³", - "123456": "123.456\u202f×\u202f10⁰³", - "123.456": "123.456\u202f×\u202f10⁰⁰", - "123.4567": "123.457\u202f×\u202f10⁰⁰", + "100": "100×10⁰⁰", + "12345": "12.345×10⁰³", + "123456": "123.456×10⁰³", + "123.456": "123.456×10⁰⁰", + "123.4567": "123.457×10⁰⁰", }, }, { pattern: "##0.000E00", test: pairs{ - "100": "100.000\u202f×\u202f10⁰⁰", - "12345": "12.345\u202f×\u202f10⁰³", - "123.456": "123.456\u202f×\u202f10⁰⁰", - "12.3456": "12.346\u202f×\u202f10⁰⁰", + "100": "100.000×10⁰⁰", + "12345": "12.345×10⁰³", + "123.456": "123.456×10⁰⁰", + "12.3456": "12.346×10⁰⁰", }, }, { pattern: "@@E0", test: pairs{ - "0": "0.0\u202f×\u202f10⁰", - "99": "9.9\u202f×\u202f10¹", - "0.99": "9.9\u202f×\u202f10⁻¹", + "0": "0.0×10⁰", + "99": "9.9×10¹", + "0.99": "9.9×10⁻¹", }, }, { pattern: "@###E00", test: pairs{ - "0": "0\u202f×\u202f10⁰⁰", - "1": "1\u202f×\u202f10⁰⁰", - "11": "1.1\u202f×\u202f10⁰¹", - "111": "1.11\u202f×\u202f10⁰²", - "1111": "1.111\u202f×\u202f10⁰³", - "11111": "1.111\u202f×\u202f10⁰⁴", - "0.1": "1\u202f×\u202f10⁻⁰¹", - "0.11": "1.1\u202f×\u202f10⁻⁰¹", - "0.001": "1\u202f×\u202f10⁻⁰³", + "0": "0×10⁰⁰", + "1": "1×10⁰⁰", + "11": "1.1×10⁰¹", + "111": "1.11×10⁰²", + "1111": "1.111×10⁰³", + "11111": "1.111×10⁰⁴", + "0.1": "1×10⁻⁰¹", + "0.11": "1.1×10⁻⁰¹", + "0.001": "1×10⁻⁰³", }, }, { pattern: "*x##0", @@ -354,18 +354,18 @@ "1234.567": "1234.567", }, }, { - pattern: "**0.0#######E00", + pattern: "**0.0#####E00", test: pairs{ - "0": "***0.0\u202f×\u202f10⁰⁰", - "10": "***1.0\u202f×\u202f10⁰¹", - "11": "***1.1\u202f×\u202f10⁰¹", - "111": "**1.11\u202f×\u202f10⁰²", - "1111": "*1.111\u202f×\u202f10⁰³", - "11111": "1.1111\u202f×\u202f10⁰⁴", - "11110": "*1.111\u202f×\u202f10⁰⁴", - "11100": "**1.11\u202f×\u202f10⁰⁴", - "11000": "***1.1\u202f×\u202f10⁰⁴", - "10000": "***1.0\u202f×\u202f10⁰⁴", + "0": "***0.0×10⁰⁰", + "10": "***1.0×10⁰¹", + "11": "***1.1×10⁰¹", + "111": "**1.11×10⁰²", + "1111": "*1.111×10⁰³", + "11111": "1.1111×10⁰⁴", + "11110": "*1.111×10⁰⁴", + "11100": "**1.11×10⁰⁴", + "11000": "***1.1×10⁰⁴", + "10000": "***1.0×10⁰⁴", }, }, { pattern: "*xpre0suf", @@ -500,9 +500,9 @@ want string }{ {f.InitDecimal, "123456.78", "123,456.78"}, - {f.InitScientific, "123456.78", "1.23\u202f×\u202f10⁵"}, - {f.InitEngineering, "123456.78", "123.46\u202f×\u202f10³"}, - {f.InitEngineering, "1234", "1.23\u202f×\u202f10³"}, + {f.InitScientific, "123456.78", "1.23×10⁵"}, + {f.InitEngineering, "123456.78", "123.46×10³"}, + {f.InitEngineering, "1234", "1.23×10³"}, {f.InitPercent, "0.1234", "12.34%"}, {f.InitPerMille, "0.1234", "123.40‰"},
diff --git a/message/fmt_test.go b/message/fmt_test.go index 42de593..a8fde6f 100644 --- a/message/fmt_test.go +++ b/message/fmt_test.go
@@ -421,8 +421,8 @@ {"%#.68U", '日', zeroFill("U+", 68, "65E5") + " '日'"}, // floats - {"%+.3e", 0.0, "+0.000\u202f×\u202f10⁰⁰"}, - {"%+.3e", 1.0, "+1.000\u202f×\u202f10⁰⁰"}, + {"%+.3e", 0.0, "+0.000×10⁰⁰"}, + {"%+.3e", 1.0, "+1.000×10⁰⁰"}, {"%+.3f", -1.0, "-1.000"}, {"%+.3F", -1.0, "-1.000"}, {"%+.3F", float32(-1.0), "-1.000"}, @@ -436,8 +436,8 @@ {"%-+07.2f", -1.0, "-1.00 "}, {"%+10.2f", +1.0, " +1.00"}, {"%+10.2f", -1.0, " -1.00"}, - {"% .3E", -1.0, "-1.000\u202f×\u202f10⁰⁰"}, - {"% .3e", 1.0, " 1.000\u202f×\u202f10⁰⁰"}, + {"% .3E", -1.0, "-1.000×10⁰⁰"}, + {"% .3e", 1.0, " 1.000×10⁰⁰"}, {"%+.3g", 0.0, "+0"}, {"%+.3g", 1.0, "+1"}, {"%+.3g", -1.0, "-1"}, @@ -501,24 +501,24 @@ {"% .f", 0i, "( 0+0i)"}, {"%+.f", 0i, "(+0+0i)"}, {"% +.f", 0i, "(+0+0i)"}, - {"%+.3e", 0i, "(+0.000\u202f×\u202f10⁰⁰+0.000\u202f×\u202f10⁰⁰i)"}, + {"%+.3e", 0i, "(+0.000×10⁰⁰+0.000×10⁰⁰i)"}, {"%+.3f", 0i, "(+0.000+0.000i)"}, {"%+.3g", 0i, "(+0+0i)"}, - {"%+.3e", 1 + 2i, "(+1.000\u202f×\u202f10⁰⁰+2.000\u202f×\u202f10⁰⁰i)"}, + {"%+.3e", 1 + 2i, "(+1.000×10⁰⁰+2.000×10⁰⁰i)"}, {"%+.3f", 1 + 2i, "(+1.000+2.000i)"}, {"%+.3g", 1 + 2i, "(+1+2i)"}, - {"%.3e", 0i, "(0.000\u202f×\u202f10⁰⁰+0.000\u202f×\u202f10⁰⁰i)"}, + {"%.3e", 0i, "(0.000×10⁰⁰+0.000×10⁰⁰i)"}, {"%.3f", 0i, "(0.000+0.000i)"}, {"%.3F", 0i, "(0.000+0.000i)"}, {"%.3F", complex64(0i), "(0.000+0.000i)"}, {"%.3g", 0i, "(0+0i)"}, - {"%.3e", 1 + 2i, "(1.000\u202f×\u202f10⁰⁰+2.000\u202f×\u202f10⁰⁰i)"}, + {"%.3e", 1 + 2i, "(1.000×10⁰⁰+2.000×10⁰⁰i)"}, {"%.3f", 1 + 2i, "(1.000+2.000i)"}, {"%.3g", 1 + 2i, "(1+2i)"}, - {"%.3e", -1 - 2i, "(-1.000\u202f×\u202f10⁰⁰-2.000\u202f×\u202f10⁰⁰i)"}, + {"%.3e", -1 - 2i, "(-1.000×10⁰⁰-2.000×10⁰⁰i)"}, {"%.3f", -1 - 2i, "(-1.000-2.000i)"}, {"%.3g", -1 - 2i, "(-1-2i)"}, - {"% .3E", -1 - 2i, "(-1.000\u202f×\u202f10⁰⁰-2.000\u202f×\u202f10⁰⁰i)"}, + {"% .3E", -1 - 2i, "(-1.000×10⁰⁰-2.000×10⁰⁰i)"}, {"%+.3g", 1 + 2i, "(+1+2i)"}, {"%+.3g", complex64(1 + 2i), "(+1+2i)"}, {"%#g", 1 + 2i, "(1.00000+2.00000i)"}, @@ -562,42 +562,42 @@ {"%-08G", complex(NaN, NaN), "(NaN +NaN i)"}, // old test/fmt_test.go - {"%e", 1.0, "1.000000\u202f×\u202f10⁰⁰"}, - {"%e", 1234.5678e3, "1.234568\u202f×\u202f10⁰⁶"}, - {"%e", 1234.5678e-8, "1.234568\u202f×\u202f10⁻⁰⁵"}, - {"%e", -7.0, "-7.000000\u202f×\u202f10⁰⁰"}, - {"%e", -1e-9, "-1.000000\u202f×\u202f10⁻⁰⁹"}, + {"%e", 1.0, "1.000000×10⁰⁰"}, + {"%e", 1234.5678e3, "1.234568×10⁰⁶"}, + {"%e", 1234.5678e-8, "1.234568×10⁻⁰⁵"}, + {"%e", -7.0, "-7.000000×10⁰⁰"}, + {"%e", -1e-9, "-1.000000×10⁻⁰⁹"}, {"%f", 1234.5678e3, "1,234,567.800000"}, {"%f", 1234.5678e-8, "0.000012"}, {"%f", -7.0, "-7.000000"}, {"%f", -1e-9, "-0.000000"}, - {"%g", 1234.5678e3, "1.2345678\u202f×\u202f10⁰⁶"}, - {"%g", float32(1234.5678e3), "1.2345678\u202f×\u202f10⁰⁶"}, - {"%g", 1234.5678e-8, "1.2345678\u202f×\u202f10⁻⁰⁵"}, + {"%g", 1234.5678e3, "1.2345678×10⁰⁶"}, + {"%g", float32(1234.5678e3), "1.2345678×10⁰⁶"}, + {"%g", 1234.5678e-8, "1.2345678×10⁻⁰⁵"}, {"%g", -7.0, "-7"}, - {"%g", -1e-9, "-1\u202f×\u202f10⁻⁰⁹"}, - {"%g", float32(-1e-9), "-1\u202f×\u202f10⁻⁰⁹"}, - {"%E", 1.0, "1.000000\u202f×\u202f10⁰⁰"}, - {"%E", 1234.5678e3, "1.234568\u202f×\u202f10⁰⁶"}, - {"%E", 1234.5678e-8, "1.234568\u202f×\u202f10⁻⁰⁵"}, - {"%E", -7.0, "-7.000000\u202f×\u202f10⁰⁰"}, - {"%E", -1e-9, "-1.000000\u202f×\u202f10⁻⁰⁹"}, - {"%G", 1234.5678e3, "1.2345678\u202f×\u202f10⁰⁶"}, - {"%G", float32(1234.5678e3), "1.2345678\u202f×\u202f10⁰⁶"}, - {"%G", 1234.5678e-8, "1.2345678\u202f×\u202f10⁻⁰⁵"}, + {"%g", -1e-9, "-1×10⁻⁰⁹"}, + {"%g", float32(-1e-9), "-1×10⁻⁰⁹"}, + {"%E", 1.0, "1.000000×10⁰⁰"}, + {"%E", 1234.5678e3, "1.234568×10⁰⁶"}, + {"%E", 1234.5678e-8, "1.234568×10⁻⁰⁵"}, + {"%E", -7.0, "-7.000000×10⁰⁰"}, + {"%E", -1e-9, "-1.000000×10⁻⁰⁹"}, + {"%G", 1234.5678e3, "1.2345678×10⁰⁶"}, + {"%G", float32(1234.5678e3), "1.2345678×10⁰⁶"}, + {"%G", 1234.5678e-8, "1.2345678×10⁻⁰⁵"}, {"%G", -7.0, "-7"}, - {"%G", -1e-9, "-1\u202f×\u202f10⁻⁰⁹"}, - {"%G", float32(-1e-9), "-1\u202f×\u202f10⁻⁰⁹"}, + {"%G", -1e-9, "-1×10⁻⁰⁹"}, + {"%G", float32(-1e-9), "-1×10⁻⁰⁹"}, {"%20.5s", "qwertyuiop", " qwert"}, {"%.5s", "qwertyuiop", "qwert"}, {"%-20.5s", "qwertyuiop", "qwert "}, {"%20c", 'x', " x"}, {"%-20c", 'x', "x "}, - {"%20.6e", 1.2345e3, " 1.234500\u202f×\u202f10⁰³"}, - {"%20.6e", 1.2345e-3, " 1.234500\u202f×\u202f10⁻⁰³"}, - {"%20e", 1.2345e3, " 1.234500\u202f×\u202f10⁰³"}, - {"%20e", 1.2345e-3, " 1.234500\u202f×\u202f10⁻⁰³"}, - {"%20.8e", 1.2345e3, " 1.23450000\u202f×\u202f10⁰³"}, + {"%20.6e", 1.2345e3, " 1.234500×10⁰³"}, + {"%20.6e", 1.2345e-3, " 1.234500×10⁻⁰³"}, + {"%20e", 1.2345e3, " 1.234500×10⁰³"}, + {"%20e", 1.2345e-3, " 1.234500×10⁻⁰³"}, + {"%20.8e", 1.2345e3, " 1.23450000×10⁰³"}, {"%20f", 1.23456789e3, " 1,234.567890"}, {"%20f", 1.23456789e-3, " 0.001235"}, {"%20f", 12345678901.23456789, "12,345,678,901.234568"}, @@ -606,7 +606,7 @@ {"%20.8f", 1.23456789e-3, " 0.00123457"}, {"%g", 1.23456789e3, "1,234.56789"}, {"%g", 1.23456789e-3, "0.00123456789"}, - {"%g", 1.23456789e20, "1.23456789\u202f×\u202f10²⁰"}, + {"%g", 1.23456789e20, "1.23456789×10²⁰"}, // arrays {"%v", array, "[1 2 3 4 5]"},
diff --git a/number/number_test.go b/number/number_test.go index 3dcac36..e79c274 100644 --- a/number/number_test.go +++ b/number/number_test.go
@@ -129,31 +129,31 @@ }, { desc: "scientific", f: Scientific(3.00), - want: "3\u202f×\u202f10⁰", + want: "3×10⁰", }, { desc: "scientific", f: Scientific(1234), - want: "1.234\u202f×\u202f10³", + want: "1.234×10³", }, { desc: "scientific", f: Scientific(1234, Scale(2)), - want: "1.23\u202f×\u202f10³", + want: "1.23×10³", }, { desc: "engineering", f: Engineering(12345), - want: "12.345\u202f×\u202f10³", + want: "12.345×10³", }, { desc: "engineering scale", f: Engineering(12345, Scale(2)), - want: "12.34\u202f×\u202f10³", + want: "12.34×10³", }, { desc: "engineering precision(4)", f: Engineering(12345, Precision(4)), - want: "12.34\u202f×\u202f10³", + want: "12.34×10³", }, { desc: "engineering precision(2)", f: Engineering(1234.5, Precision(2)), - want: "1.2\u202f×\u202f10³", + want: "1.2×10³", }, { desc: "percent", f: Percent(0.12),