1 // Copyright 2017 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
12 "golang.org/x/text/language"
15 func TestAppendDecimal(t *testing.T) {
16 type pairs map[string]string // alternates with decimal input and result
18 testCases := []struct {
20 // We want to be able to test some forms of patterns that cannot be
21 // represented as a string.
106 "1.2345": "1.234", // rounding should have been done earlier
108 "1234.567": "1234.567",
111 pattern: "#0.######",
114 "1234.5678": "1234.5678",
115 "0.123456789": "0.123456",
137 pattern: "#,##,#.00",
142 pattern: "#,##0.###",
145 "1234.5678": "1,234.567",
146 "0.123456789": "0.123",
149 pattern: "#,##,##0.###",
152 "123456789012": "1,23,45,67,89,012",
153 "0.123456789": "0.123",
156 pattern: "0,00,000.###",
159 "123456789012": "1,23,45,67,89,012",
160 "12.3456789": "0,00,012.345",
161 "0.123456789": "0,00,000.123",
164 // Support for ill-formed patterns.
168 ".00": "", // This is the behavior of fmt.
169 "0": "", // This is the behavior of fmt.
176 "0": "", // This is the behavior of fmt.
194 pattern: "#,max_int=2",
196 RoundingContext: RoundingContext{
204 pattern: "0,max_int=2",
206 RoundingContext: RoundingContext{
217 pattern: "00,max_int=2",
219 RoundingContext: RoundingContext{
230 pattern: "@@@@,max_int=2",
232 RoundingContext: RoundingContext{
234 MinSignificantDigits: 4,
243 // Significant digits
261 "12345": "12340", // rounding down
267 // {"@@@@": "23456": "23460"}, // rounding up
270 // Scientific and Engineering notation
274 "0": "0\u202f×\u202f10⁰",
275 "1": "1\u202f×\u202f10⁰",
276 "123.456": "1\u202f×\u202f10²",
281 "0": "0\u202f×\u202f10⁺⁰",
282 "1000": "1\u202f×\u202f10⁺³",
283 "1E100": "1\u202f×\u202f10⁺¹⁰⁰",
284 "1E-100": "1\u202f×\u202f10⁻¹⁰⁰",
291 "100": "100\u202f×\u202f10⁰⁰",
292 "12345": "12\u202f×\u202f10⁰³",
293 "123.456": "123\u202f×\u202f10⁰⁰",
296 pattern: "##0.###E00",
298 "100": "100\u202f×\u202f10⁰⁰",
299 "12345": "12.345\u202f×\u202f10⁰³",
300 "123456": "123.456\u202f×\u202f10⁰³",
301 "123.456": "123.456\u202f×\u202f10⁰⁰",
302 "123.4567": "123.457\u202f×\u202f10⁰⁰",
305 pattern: "##0.000E00",
307 "100": "100.000\u202f×\u202f10⁰⁰",
308 "12345": "12.345\u202f×\u202f10⁰³",
309 "123.456": "123.456\u202f×\u202f10⁰⁰",
310 "12.3456": "12.346\u202f×\u202f10⁰⁰",
315 "0": "0.0\u202f×\u202f10⁰",
316 "99": "9.9\u202f×\u202f10¹",
317 "0.99": "9.9\u202f×\u202f10⁻¹",
322 "0": "0\u202f×\u202f10⁰⁰",
323 "1": "1\u202f×\u202f10⁰⁰",
324 "11": "1.1\u202f×\u202f10⁰¹",
325 "111": "1.11\u202f×\u202f10⁰²",
326 "1111": "1.111\u202f×\u202f10⁰³",
327 "11111": "1.111\u202f×\u202f10⁰⁴",
328 "0.1": "1\u202f×\u202f10⁻⁰¹",
329 "0.11": "1.1\u202f×\u202f10⁻⁰¹",
330 "0.001": "1\u202f×\u202f10⁻⁰³",
349 pattern: "* ###0.000",
353 "123.456": " 123.456",
354 "1234.567": "1234.567",
357 pattern: "**0.0#######E00",
359 "0": "***0.0\u202f×\u202f10⁰⁰",
360 "10": "***1.0\u202f×\u202f10⁰¹",
361 "11": "***1.1\u202f×\u202f10⁰¹",
362 "111": "**1.11\u202f×\u202f10⁰²",
363 "1111": "*1.111\u202f×\u202f10⁰³",
364 "11111": "1.1111\u202f×\u202f10⁰⁴",
365 "11110": "*1.111\u202f×\u202f10⁰⁴",
366 "11100": "**1.11\u202f×\u202f10⁰⁴",
367 "11000": "***1.1\u202f×\u202f10⁰⁴",
368 "10000": "***1.0\u202f×\u202f10⁰⁴",
371 pattern: "*xpre0suf",
377 pattern: "*∞ pre ###0 suf",
379 "0": "∞∞∞ pre 0 suf",
380 "10": "∞∞ pre 10 suf",
381 "100": "∞ pre 100 suf",
382 "1000": " pre 1000 suf",
385 pattern: "pre *∞###0 suf",
388 "10": "pre ∞∞10 suf",
389 "100": "pre ∞100 suf",
390 "1000": "pre 1000 suf",
393 pattern: "pre ###0*∞ suf",
396 "10": "pre 10∞∞ suf",
397 "100": "pre 100∞ suf",
398 "1000": "pre 1000 suf",
401 pattern: "pre ###0 suf *∞",
403 "0": "pre 0 suf ∞∞∞",
404 "10": "pre 10 suf ∞∞",
405 "100": "pre 100 suf ∞",
406 "1000": "pre 1000 suf ",
409 // Take width of positive pattern.
410 pattern: "**###0;**-#####0x",
436 "0.11111": "‰ 111.11",
437 "0.111111": "‰ 111.11",
443 // "#,##0.00 ¤;(#,##0.00 ¤)",
445 for _, tc := range testCases {
449 if pat, err = ParsePattern(tc.pattern); err != nil {
454 f.InitPattern(language.English, pat)
455 for num, want := range tc.test {
456 buf := make([]byte, 100)
457 t.Run(tc.pattern+"/"+num, func(t *testing.T) {
459 d.Convert(f.RoundingContext, dec(num))
460 buf = f.Format(buf[:0], &d)
461 if got := string(buf); got != want {
462 t.Errorf("\n got %[1]q (%[1]s)\nwant %[2]q (%[2]s)", got, want)
469 func TestLocales(t *testing.T) {
470 testCases := []struct {
475 {language.Make("en"), "123456.78", "123,456.78"},
476 {language.Make("de"), "123456.78", "123.456,78"},
477 {language.Make("de-CH"), "123456.78", "123’456.78"},
478 {language.Make("fr"), "123456.78", "123 456,78"},
479 {language.Make("bn"), "123456.78", "১,২৩,৪৫৬.৭৮"},
481 for _, tc := range testCases {
482 t.Run(fmt.Sprint(tc.tag, "/", tc.num), func(t *testing.T) {
484 f.InitDecimal(tc.tag)
486 d.Convert(f.RoundingContext, dec(tc.num))
487 b := f.Format(nil, &d)
488 if got := string(b); got != tc.want {
489 t.Errorf("got %[1]q (%[1]s); want %[2]q (%[2]s)", got, tc.want)
495 func TestFormatters(t *testing.T) {
497 testCases := []struct {
498 init func(t language.Tag)
502 {f.InitDecimal, "123456.78", "123,456.78"},
503 {f.InitScientific, "123456.78", "1.23\u202f×\u202f10⁵"},
504 {f.InitEngineering, "123456.78", "123.46\u202f×\u202f10³"},
505 {f.InitEngineering, "1234", "1.23\u202f×\u202f10³"},
507 {f.InitPercent, "0.1234", "12.34%"},
508 {f.InitPerMille, "0.1234", "123.40‰"},
510 for i, tc := range testCases {
511 t.Run(fmt.Sprint(i, "/", tc.num), func(t *testing.T) {
512 tc.init(language.English)
515 d.Convert(f.RoundingContext, dec(tc.num))
516 b := f.Format(nil, &d)
517 if got := string(b); got != tc.want {
518 t.Errorf("got %[1]q (%[1]s); want %[2]q (%[2]s)", got, tc.want)