Подтвердить что ты не робот

Parse String to Long с использованием определенной локали (sv) и NumberFormat

Я попытался разобрать строку (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, для языкового стандарта, правильно отформатированное двойное значение, сохраненное как строка?

4b9b3361

Ответ 1

Шведский, как и французский, нуждается в жесткой. неразрывное пространство.

longString = longString.replace(' ', '\u00a0');

обременительно.

Ответ 2

Не могли бы вы попробовать

Разберите эту строку с ручным настройкой 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.

Ответ 3

Как видно из этого сообщения, вам нужно установить пробел как разделитель вручную.

 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" в последней строке (я использовал только обычные пробелы).