Почему префиксы и суффиксы определенных форматов валют Java заканчиваются символом, подобным пробелу, а не пробелом? - PullRequest
0 голосов
/ 14 января 2019

Я получаю все доступные форматы валюты 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).

...