Я получаю все доступные форматы валюты 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).
Скорее всего, потому, что строку EUR 5 не следует переносить на другую строку.
@corsiKa Возможно? Моя проблема? Я не использую эти префиксы, но NumberFormat.parse есть, и JRE предоставляет их. Я могу только управлять возвращаемыми им значениями. И я ищу способ избежать этого (конфигурация и т. д.).
@chrylis А ... в этом есть смысл. Однако не имеет смысла возвращать только один NumberFormat. Кажется странным, что префиксы (и суффиксы) DecimalFormat, предоставляемые JRE, являются литералами, а не регулярными выражениями. В противном случае возвращаемое значение должно содержать экземпляр для каждого символа пробела как для префикса, так и для суффикса, а также как положительный, так и отрицательный, что было бы пустой тратой по сравнению с RE.




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