В публикации « Компактное форматирование чисел доходит до JDK 12 » демонстрируется добавленная поддержка NumberFormat в JDK 12 для поддержки форматирования компактных чисел . В примерах, приведенных в этом посте, использовались только экземпляры NumberFormat возвращаемые NumberFormat новых перегруженных getCompactNumberInstance(-) поэтому они не указывали такие характеристики, как минимальные дробные цифры и максимальные дробные цифры . Результаты, в некоторых случаях, меньше, чем хотелось бы. К счастью, NumberFormat позволяет NumberFormat минимальные и максимальные дробные цифры, и этот пост демонстрирует, как это может улучшить вывод форматирования компактного числа, доступного в JDK 12 .
Список кода, представленный в оригинальном посте « Компактное форматирование чисел доходит до JDK 12 » (и который доступен на GitHub ), был обновлен для демонстрации использования NumberFormat.setMinimumFractionDigits (int) . Выдержка из этого кода показана далее и сопровождается сопровождающим выводом.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
/** * Generates standardized map of labels to Compact Number Format * instances described by the labels. The instances of {@code NumberFormat} * are created with Locale and Style only and with the provided number * of minimum fractional digits. * * @return Mapping of label to an instance of a Compact Number Format * consisting of a Locale, Style, and specified minimum number of fractional * digits that is described by the label. */private static Map<String, NumberFormat> generateCompactNumberFormats( final int minimumNumberFractionDigits){ var numberFormats = generateCompactNumberFormats(); numberFormats.forEach((label, numberFormat) -> numberFormat.setMinimumFractionDigits(minimumNumberFractionDigits)); return numberFormats;}/** * Demonstrates compact number formatting in a variety of locales * and number formats against the provided {@code long} value and * with a minimum fractional digits of 1 specified. * @param numberToFormat Value of type {@code long} that is to be * formatted using compact number formatting and a variety of * locales and number formats and with a single minimal fractional * digit. */private static void demonstrateCompactNumberFormattingOneFractionalDigitMinimum( final long numberToFormat){ final Map<String, NumberFormat> numberFormats = generateCompactNumberFormats(1); out.println( "Demonstrating Compact Number Formatting on long '" + numberToFormat + "' with 1 minimum fraction digit:"); numberFormats.forEach((label, numberFormat) -> out.println("\t" + label + ": " + numberFormat.format(numberToFormat)) );} |
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
Demonstrating Compact Number Formatting on long '15' with 1 minimum fraction digit: Default: 15 US/Long: 15 UK/Short: 15 UK/Long: 15 FR/Short: 15 FR/Long: 15 DE/Short: 15 DE/Long: 15 IT/Short: 15 IT/Long: 15Demonstrating Compact Number Formatting on long '150' with 1 minimum fraction digit: Default: 150 US/Long: 150 UK/Short: 150 UK/Long: 150 FR/Short: 150 FR/Long: 150 DE/Short: 150 DE/Long: 150 IT/Short: 150 IT/Long: 150Demonstrating Compact Number Formatting on long '1500' with 1 minimum fraction digit: Default: 1.5K US/Long: 1.5 thousand UK/Short: 1.5K UK/Long: 1.5 thousand FR/Short: 1,5 k FR/Long: 1,5 millier DE/Short: 1.500 DE/Long: 1,5 Tausend IT/Short: 1.500 IT/Long: 1,5 milleDemonstrating Compact Number Formatting on long '15000' with 1 minimum fraction digit: Default: 15.0K US/Long: 15.0 thousand UK/Short: 15.0K UK/Long: 15.0 thousand FR/Short: 15,0 k FR/Long: 15,0 mille DE/Short: 15.000 DE/Long: 15,0 Tausend IT/Short: 15.000 IT/Long: 15,0 milaDemonstrating Compact Number Formatting on long '150000' with 1 minimum fraction digit: Default: 150.0K US/Long: 150.0 thousand UK/Short: 150.0K UK/Long: 150.0 thousand FR/Short: 150,0 k FR/Long: 150,0 mille DE/Short: 150.000 DE/Long: 150,0 Tausend IT/Short: 150.000 IT/Long: 150,0 milaDemonstrating Compact Number Formatting on long '1500000' with 1 minimum fraction digit: Default: 1.5M US/Long: 1.5 million UK/Short: 1.5M UK/Long: 1.5 million FR/Short: 1,5 M FR/Long: 1,5 million DE/Short: 1,5 Mio. DE/Long: 1,5 Million IT/Short: 1,5 Mln IT/Long: 1,5 milioneDemonstrating Compact Number Formatting on long '15000000' with 1 minimum fraction digit: Default: 15.0M US/Long: 15.0 million UK/Short: 15.0M UK/Long: 15.0 million FR/Short: 15,0 M FR/Long: 15,0 million DE/Short: 15,0 Mio. DE/Long: 15,0 Millionen IT/Short: 15,0 Mln IT/Long: 15,0 milioni |
Как показывают пример и выходные данные, показанные выше, использование NumberFormat.setMinimumFractionDigits(int) приводит к компактному форматированному выводу, который во многих случаях, вероятно, будет более эстетичным. В списке рассылки OpenJDK core-libs-dev недавно обсуждалась « Компактное форматирование чисел и дробные цифры », в котором также обсуждается возможность настройки вывода для форматирования компактных чисел.
|
Опубликовано на Java Code Geeks с разрешения Дастина Маркса, партнера нашей программы JCG . См. Оригинальную статью здесь: Использование минимальных дробных цифр с JDK 12 Compact Number Formatting Мнения, высказанные участниками Java Code Geeks, являются их собственными. |