Ответ 1
Шведский, как и французский, нуждается в жесткой. неразрывное пространство.
longString = longString.replace(' ', '\u00a0');
обременительно.
Я попытался разобрать строку (14 123) на длинную в java, используя шведский язык, используя этот код:
String longString = "14 123"
NumberFormat swedishNumberFormat = NumberFormat.getInstance(new Locale("sv"));
System.out.println(swedishNumberFormat.parse(longString).longValue());
Выход этого кода равен 14 (он должен быть 14123). По этот вопрос я пробовал как с sv, так и с sv_SE, но на этот раз результат был одинаковым в обоих случаях.
Согласно http://www.localeplanet.com/java/sv/index.html и http://www.localeplanet.com/java/sv-SE/index.html разделитель группировки в обоих случаях является пространством (), так почему строка для длинного разбора не обрабатывает a, для языкового стандарта, правильно отформатированное двойное значение, сохраненное как строка?
Шведский, как и французский, нуждается в жесткой. неразрывное пространство.
longString = longString.replace(' ', '\u00a0');
обременительно.
Не могли бы вы попробовать
Разберите эту строку с ручным настройкой DecimalFormat. Постройте его, настройте на setGroupingUsed (true), setDecimalSymbols со своими собственными символами DecimalFormatSymbols.
DecimalFormat df=new DecimalFormat();
df.setGroupingSize(3);
df.setGroupingUsed(true);
DecimalFormatSymbols newSymbols=new DecimalFormatSymbols();
newSymbols.setGroupingSeparator(' ');
df.setDecimalFormatSymbols(newSymbols);
df.parse(longString)
Второй вариант заключается в том, чтобы отлаживать ваш код в виде экземпляра swedishNumberFormat, который у вас есть. проверять поля группировкиSize, decimalFormatSymbols.groupingSeparators.
Как видно из этого сообщения, вам нужно установить пробел как разделитель вручную.
try {
String longString = "14 123";
DecimalFormat decimalFormat = new DecimalFormat(); // instead of NumberFormat, use DecimalFormat
DecimalFormatSymbols symbols = new DecimalFormatSymbols(new Locale("sv", "SE"));
symbols.setGroupingSeparator(' '); // set the whitespace manually as grouping seperator
decimalFormat.setDecimalFormatSymbols(symbols);
System.out.println(svSE.parse(longString));
} catch (ParseException ex) {
Logger.getLogger(Playground.class.getName()).log(Level.SEVERE, null, ex);
}
//> output is 14123
Честно говоря, я немного смущен, но я думаю, что проблема в том, что вам нужны сформированные строки (видимо, не все пробелы здесь одинаковы)
try {
long testNumber = 123987l;
NumberFormat swedishNumberFormat = NumberFormat.getInstance(new Locale("sv"));
//here I format the number into a String
String formatedString = swedishNumberFormat.format(testNumber);
System.out.println(formatedString); // result: "123 987"
// when parsing the formated String back into a number
System.out.println(swedishNumberFormat.parse(formatedString)); // result: "123987"
// but when parsing a non formated string like this one
System.out.println(swedishNumberFormat.parse("123 987")); // result "123"
} catch (ParseException ex) {
Logger.getLogger(Playground.class.getName()).log(Level.SEVERE, null, ex);
}
Пожалуйста, поправьте меня, если я ошибаюсь, или мой пример не работает. У меня нет идеи, почему она делает такие вещи, но чтобы избежать путаных ситуаций, подобных описанным выше, вы можете установить разделитель вручную.
ИЗМЕНИТЬ
как заявил Joop Eggen в своем ответе String должен использовать жесткое, неразрывное пространство ('\u00a0'
) вместо простого пробела. Вот почему мой пример возвращает "123" в последней строке (я использовал только обычные пробелы).