Почему префиксы и суффиксы некоторых валютных форматов Java заканчиваются пробелом вместо пробела?

Я получаю все доступные форматы валюты 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 (все они) с positivePrefixEUR, однако последний символ не пробел, а один с числовым значением -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.

Я ищу NumberFormats / DecimalFormats с пробелом в их префиксе или суффиксе, потому что я работаю с данными OCR, которые вряд ли когда-либо будут иметь защищенное (= не разрывающее строки) пространство.

Я использую OpenJDK 11 в Ubuntu 18.10 с немецкой локалью / языковым пакетом по умолчанию (который не должен иметь никакого влияния на код выше afaik).

Ваш, вероятно, исчезнет, ​​если вы будете искать какие-либо пробелы \\s+ вместо ' '?

corsiKa 13.01.2019 22:43

Скорее всего, потому, что строку EUR 5 не следует переносить на другую строку.

chrylis -cautiouslyoptimistic- 13.01.2019 23:12

@corsiKa Возможно? Моя проблема? Я не использую эти префиксы, но NumberFormat.parse есть, и JRE предоставляет их. Я могу только управлять возвращаемыми им значениями. И я ищу способ избежать этого (конфигурация и т. д.).

Kalle Richter 14.01.2019 08:27

@chrylis А ... в этом есть смысл. Однако не имеет смысла возвращать только один NumberFormat. Кажется странным, что префиксы (и суффиксы) DecimalFormat, предоставляемые JRE, являются литералами, а не регулярными выражениями. В противном случае возвращаемое значение должно содержать экземпляр для каждого символа пробела как для префикса, так и для суффикса, а также как положительный, так и отрицательный, что было бы пустой тратой по сравнению с RE.

Kalle Richter 14.01.2019 08:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
372
0

Другие вопросы по теме