DecimalFormatSymbols имеет неожиданные значения для конкретных регионов для неортодоксальных локалей.
С помощью
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
, я хочу немецкий. За
de-US
Я хочу английский формат.
1 ответ
Информация о локали, напримерDecimalFormatSymbols
, обычно хранятся в библиотеке времени выполнения Java вResourceBundle
файлы.
Прочтите javadoc для получения полной информации, но соответствующая часть:
Пакеты ресурсов принадлежат семействам, члены которых имеют общее базовое имя, но имена которых также содержат дополнительные компоненты, идентифицирующие их локали. Например, базовое имя семейства пакетов ресурсов может быть «MyResources». Семейство должно иметь набор ресурсов по умолчанию, который просто имеет то же имя, что и его семейство — «MyResources» — и будет использоваться в качестве последнего средства, если конкретная локаль не поддерживается. Затем семейство может предоставить столько элементов, зависящих от локали, сколько необходимо, например, немецкий элемент с именем «MyResources_de».
Если есть разные ресурсы для разных стран, можно сделать специализации: например, «MyResources_de_CH» содержит объекты для немецкого языка (de) в Швейцарии (CH). Если вы хотите изменить только некоторые ресурсы в специализации, вы можете это сделать.
Таким образом, поиск символов будет использовать
language-country
комбо. Если не найдено, он попытается использовать только
language
. В противном случае будет использоваться базовый файл со значениями по умолчанию.
Значение по умолчанию для
getGroupingSeparator
является
,
, так что это значение вы получаете для неподдерживаемых локалей, таких как
DE
а также
RU
.