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 : 15 Demonstrating 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 : 150 Demonstrating 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 mille Demonstrating 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 mila Demonstrating 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 mila Demonstrating 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 milione Demonstrating 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, являются их собственными. |