Я получаю все доступные форматы валюты Java следующим образом:
for(Locale locale : Locale.getAvailableLocales()) {
for(Currency currency : Currency.getAvailableCurrencies()) {
NumberFormat numberFormat = NumberFormat.getCurrencyInstance(locale);
numberFormat.setCurrency(currency);
//do something with the format
}
}
Я пытался разобрать строку наподобие EUR 5
, когда заметил, что существует формат DecimalFormat
(все они) с positivePrefix
EUR
, однако последний символ - не пробел, а один с числовым значением -1
. И этот префикс никогда не совпадает с EUR
(с реальным пробелом) в EUR 5
, что делает его бесполезным для важного варианта использования.
Я могу обойти эту проблему, создав свои собственные DecimalFormat
, однако я хотел бы понять, почему я получаю эти форматы, то есть префиксы в форматах, и есть ли возможность настройки отсутствует, чтобы избежать их (и получить «настоящие» пробелы для форматов с конечным или начальным пробелом в префиксе или суффиксе).
Я столкнулся с ошибкой?
Я сделал следующую проверку:
boolean positivePrefixTrailingSpace = false;
boolean positiveSuffixLeadingSpace = false;
boolean negativePrefixTrailingSpace = false;
boolean negativeSuffixLeadingSpace = false;
for(Locale locale : Locale.getAvailableLocales()) {
for(Currency currency : Currency.getAvailableCurrencies()) {
NumberFormat numberFormat = NumberFormat.getCurrencyInstance(locale);
numberFormat.setCurrency(currency);
DecimalFormat numberFormatCast = (DecimalFormat)numberFormat;
if(numberFormatCast.getPositivePrefix().endsWith(" ")
&& numberFormatCast.getPositivePrefix().contains("EUR")) {
positivePrefixTrailingSpace = true;
}
if(numberFormatCast.getPositiveSuffix().startsWith(" ")
&& numberFormatCast.getPositivePrefix().contains("EUR")) {
positiveSuffixLeadingSpace = true;
}
if(numberFormatCast.getNegativePrefix().endsWith(" ")
&& numberFormatCast.getPositivePrefix().contains("EUR")) {
negativePrefixTrailingSpace = true;
}
if(numberFormatCast.getNegativeSuffix().startsWith(" ")
&& numberFormatCast.getPositivePrefix().contains("EUR")) {
negativeSuffixLeadingSpace = true;
}
}
}
, в котором все логические значения false
.
Я ищу NumberFormat
s / DecimalFormat
s с пробелом в их префиксе или суффиксе, потому что я работаю с данными OCR, которые вряд ли когда-либо будут иметь защищенное (= непереносимое) пространство.
Я использую OpenJDK 11 в Ubuntu 18.10 с немецким языковым стандартом / языковым пакетом по умолчанию (который не должен иметь никакого влияния на код выше afaik).