Статьи

Компактное форматирование чисел приходит к JDK 12

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, являются их собственными.