JDK 12 Early Access Build 24 предоставляет поддержку компактного форматирования чисел . «Сводка» CSR в JDK-8188147 (поддержка компактного форматирования чисел) — это простое предложение: «Добавление поддержки форматирования компактных / коротких номеров в JDK». Тот же CSR также предоставляет подробный раздел «Решение», в котором содержится справочная информация о предоставлении чисел в нескольких компактных формах для каждой локали и конструкций / API, добавленных в JDK для поддержки этой функциональности (новый класс, новый enum, новые методы и т. Д.)
Представления компактных и коротких форматов чисел в каждой локали основаны на Unicode Common Locale Data Repository (CLDR) . Недавно добавленный класс, java.text.CompactNumberFormat , содержит комментарии Javadoc уровня класса, которые предоставляют довольно подробную информацию о том, как числа выражаются в «коротких» и «длинных» форматах компактных чисел. В комментариях Javadoc этого класса также указываются шаблоны компактного числа, форматирование, анализ и округление (по умолчанию RoundingMode.HALF_EVEN ), связанные с пользовательскими форматами чисел.
В просьбе рассмотреть добавление компактного форматирования чисел в JDK 12 Нишит Джайн пишет:
Существующий API NumberFormat обеспечивает поддержку форматирования и анализа чисел на основе локали, включая десятичное, процентное, валютное и т. Д. Форматирование, но отсутствует поддержка форматирования числа в удобочитаемую или компактную форму. Этот RFE добавляет эту функцию для форматирования десятичного числа в компактном формате (например, 1000 -> 1K, 1000000 -> 1M в локали en_US), что полезно для среды, где пространство отображения ограничено, так что форматированная строка может отображаться в этом ограниченном пространстве. Это определяется спецификацией LDML для форматов компактных номеров.
http://unicode.org/reports/tr35/tr35-numbers.html#Compact_Number_Formats
Вероятно, проще всего понять форматирование компактных чисел на примере кода. Следующий класс ( CompactNumberFormatDemo ) был скомпилирован и выполнен для JDK 12 Early Access Build 24 .
|
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
|
package dustin.examples.jdk12.format; import static java.lang.System.out; import java.text.NumberFormat; import java.util.Locale; /** * Demonstrate Compact Number Format support added to * JDK 12 as of Early Access Build 24 (see also * JDK-8177552: Compact Number Formatting support). */ public class CompactNumberFormatDemo { private static void demonstrateCompactNumberFormatting(final long numberToFormat) { final NumberFormat numberFormatDefault = NumberFormat.getCompactNumberInstance(); final NumberFormat numberFormatUsLong = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.LONG); final NumberFormat numberFormatUkShort = NumberFormat.getCompactNumberInstance(Locale.UK, NumberFormat.Style.SHORT); final NumberFormat numberFormatUkLong = NumberFormat.getCompactNumberInstance(Locale.UK, NumberFormat.Style.LONG); final NumberFormat numberFormatFrShort = NumberFormat.getCompactNumberInstance(Locale.FRANCE, NumberFormat.Style.SHORT); final NumberFormat numberFormatFrLong = NumberFormat.getCompactNumberInstance(Locale.FRANCE, NumberFormat.Style.LONG); final NumberFormat numberFormatGrShort = NumberFormat.getCompactNumberInstance(Locale.GERMANY, NumberFormat.Style.SHORT); final NumberFormat numberFormatGrLong = NumberFormat.getCompactNumberInstance(Locale.GERMANY, NumberFormat.Style.LONG); final NumberFormat numberFormatItShort = NumberFormat.getCompactNumberInstance(Locale.ITALY, NumberFormat.Style.SHORT); final NumberFormat numberFormatItLong = NumberFormat.getCompactNumberInstance(Locale.ITALY, NumberFormat.Style.LONG); out.println("Demonstrating Compact Number Formatting on '" + numberToFormat + "':"); out.println("\tDefault: " + numberFormatDefault.format(numberToFormat)); out.println("\tUS/Long: " + numberFormatUsLong.format(numberToFormat)); out.println("\tUK/Short: " + numberFormatUkShort.format(numberToFormat)); out.println("\tUK/Long: " + numberFormatUkLong.format(numberToFormat)); out.println("\tFR/Short: " + numberFormatFrShort.format(numberToFormat)); out.println("\tFR/Long: " + numberFormatFrLong.format(numberToFormat)); out.println("\tGR/Short: " + numberFormatGrShort.format(numberToFormat)); out.println("\tGR/Long: " + numberFormatGrLong.format(numberToFormat)); out.println("\tIT/Short: " + numberFormatItShort.format(numberToFormat)); out.println("\tIT/Long: " + numberFormatItLong.format(numberToFormat)); } /** * Main demonstration executable. * @param arguments Command-line arguments: none expected. */ public static void main(final String[] arguments) { demonstrateCompactNumberFormatting(15); demonstrateCompactNumberFormatting(150); demonstrateCompactNumberFormatting(1500); demonstrateCompactNumberFormatting(15000); demonstrateCompactNumberFormatting(150000); demonstrateCompactNumberFormatting(1500000); demonstrateCompactNumberFormatting(15000000); } } |
При выполнении вышеприведенный код записывает следующее в стандартный вывод:
|
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 '15': Default: 15 US/Long: 15 UK/Short: 15 UK/Long: 15 FR/Short: 15 FR/Long: 15 GR/Short: 15 GR/Long: 15 IT/Short: 15 IT/Long: 15Demonstrating Compact Number Formatting on '150': Default: 150 US/Long: 150 UK/Short: 150 UK/Long: 150 FR/Short: 150 FR/Long: 150 GR/Short: 150 GR/Long: 150 IT/Short: 150 IT/Long: 150Demonstrating Compact Number Formatting on '1500': Default: 2K US/Long: 2 thousand UK/Short: 2K UK/Long: 2 thousand FR/Short: 2 k FR/Long: 2 millier GR/Short: 1.500 GR/Long: 2 Tausend IT/Short: 1.500 IT/Long: 2 milleDemonstrating Compact Number Formatting on '15000': Default: 15K US/Long: 15 thousand UK/Short: 15K UK/Long: 15 thousand FR/Short: 15 k FR/Long: 15 mille GR/Short: 15.000 GR/Long: 15 Tausend IT/Short: 15.000 IT/Long: 15 milaDemonstrating Compact Number Formatting on '150000': Default: 150K US/Long: 150 thousand UK/Short: 150K UK/Long: 150 thousand FR/Short: 150 k FR/Long: 150 mille GR/Short: 150.000 GR/Long: 150 Tausend IT/Short: 150.000 IT/Long: 150 milaDemonstrating Compact Number Formatting on '1500000': Default: 2M US/Long: 2 million UK/Short: 2M UK/Long: 2 million FR/Short: 2 M FR/Long: 2 million GR/Short: 2 Mio. GR/Long: 2 Million IT/Short: 2 Mln IT/Long: 2 milioneDemonstrating Compact Number Formatting on '15000000': Default: 15M US/Long: 15 million UK/Short: 15M UK/Long: 15 million FR/Short: 15 M FR/Long: 15 million GR/Short: 15 Mio. GR/Long: 15 Millionen IT/Short: 15 Mln IT/Long: 15 milioni |
Поддержка формата компактных чисел , которая была добавлена в JDK 12 через раннюю сборку 24, позволяет форматировать и анализировать числовые представления в специфичных для локали «длинных» или «коротких» компактных формах.
|
Опубликовано на Java Code Geeks с разрешения Дастина Маркса, партнера нашей программы JCG . См. Оригинальную статью здесь: Краткая, но сложная история метода String :: transform в JDK 12 Мнения, высказанные участниками Java Code Geeks, являются их собственными. |