С помощью DecimalFormatSymbols вы можете запросить характеристики на основе локали, такие как десятичный разделитель или разделитель тысяч.
Пока вы запрашиваете у него обычные языковые теги (например, de-AT, en-US), он работает должным образом. Но если вы смешиваете комбинации языка и страны, это ведет себя странно. В частности, давайте посмотрим на разделитель тысяч. (для английского это ,, для немецкого - .)
System.out.println("en-US: " + DecimalFormatSymbols.getInstance(Locale.US).getGroupingSeparator());
System.out.println("de-DE: " + DecimalFormatSymbols.getInstance(Locale.GERMANY).getGroupingSeparator());
System.out.println("de-US: " + DecimalFormatSymbols.getInstance(new Locale.Builder().setLanguage("de").setRegion("US").build()).getGroupingSeparator());
System.out.println("de: "+DecimalFormatSymbols.getInstance(new Locale.Builder().setLanguage("de").build()).getGroupingSeparator());
System.out.println("DE: " + DecimalFormatSymbols.getInstance(new Locale.Builder().setRegion("DE").build()).getGroupingSeparator());
System.out.println("ru-RU: " + DecimalFormatSymbols.getInstance(new Locale.Builder().setLanguage("ru").setRegion("RU").build()).getGroupingSeparator());
System.out.println("RU: " + DecimalFormatSymbols.getInstance(new Locale.Builder().setRegion("RU").build()).getGroupingSeparator());
Результат:
en-US: ,
de-DE: .
de-US: .
de: .
DE: ,
ru-RU: 0x160
RU: ,
Для de-US он указывает точку в качестве разделителя, который представляет разделитель на немецком языке, но не для США. Как будто учитывается только языковой тег.
Если я создаю локаль, в которой есть только информация о стране (язык отсутствует), кажется, что всегда возвращается английский формат разделителя.
Как я могу с этим справиться? Мне нужен формат для наиболее конкретной информации в данном регионе. Для de хочу немецкий. Для de-US мне нужен английский формат.




Информация о локали, такая как DecimalFormatSymbols, обычно хранится в библиотеке времени выполнения Java в файлах ResourceBundle.
Прочтите javadoc для получения полной информации, но соответствующая часть:
Resource bundles belong to families whose members share a common base name, but whose names also have additional components that identify their locales. For example, the base name of a family of resource bundles might be "MyResources". The family should have a default resource bundle which simply has the same name as its family - "MyResources" - and will be used as the bundle of last resort if a specific locale is not supported. The family can then provide as many locale-specific members as needed, for example a German one named "MyResources_de".
If there are different resources for different countries, you can make specializations: for example, "MyResources_de_CH" contains objects for the German language (de) in Switzerland (CH). If you want to only modify some of the resources in the specialization, you can do so.
Итак, поиск символа будет использовать комбо language-country. Если он не найден, он попытается использовать только language. В противном случае он будет использовать базовый файл со значениями по умолчанию.
Значение по умолчанию для getGroupingSeparator - ,, поэтому это значение вы получаете для неподдерживаемых локалей, таких как DE и RU.
Спасибо за это разъяснение. Благодаря вашей помощи я узнал, что эти доступные настройки находятся в
/jdk-installation/jre/lib/ext/localedata.jar. Для многих локалей существуют классы Java пакета ресурсов, которые статически предоставляют различную информацию, зависящую от локали. КлючNumberElementsбудет рассмотрен позже, чтобы предоставить этот разделитель группировки. Все, что мне нужно сделать сейчас, это добавить недостающие языковые стандарты в эти запутанные структуры данных java.