NumberFormatException в устройстве, но не в эмуляторе

Я запускаю свое приложение в эмуляторе, и все работает нормально, но когда я запускаю его на своем устройстве (Huawei u8650), я получаю NumberFormatException:

GraphViewData[] aux2 = new GraphViewData[aux.length];
     for(int i=0;i<aux.length;i++)
     {
         System.out.println("reps "+Repetitions+", dato "+i+" = "+aux[i]);
         if(aux[i] != null)
         {
             try{
         aux2[i]= new GraphViewData(i, Double.parseDouble(aux[i]));
             }catch(Exception w)
         {
                 Toast.makeText(this, "num: "+aux[i], Toast.LENGTH_LONG).show();
                 Toast.makeText(this, w.getMessage(), Toast.LENGTH_LONG).show();
         }
         }
}

Исключение составляет: aux2[i]= new GraphViewData(i, Double.parseDouble(aux[i])); Хорошо, вы могли бы подумать, что aux[i] будет иметь неправильный формат для анализа на удвоение, но все они имеют число, подобное этому: 70,5 или около этого 84. Поэтому я не знаю, почему это исключение выдается только в реальном устройстве, а не в эмуляторе .

Какие-либо предложения? заранее спасибо.


person J. Arenas    schedule 10.09.2012    source источник
comment
скорее всего проблема с локалью. в некоторых локалях будет ожидаться 70,5 вместо 70,5   -  person njzk2    schedule 10.09.2012
comment
я думаю, это может помочь вам stackoverflow.com/questions/7477995 /   -  person Ram kiran    schedule 10.09.2012
comment
Спасибо @Ram kiran с тем, что больше нет NumberFormatException, но кажется, что значения меняются, я не получаю один и тот же график в эмуляторе и на устройстве   -  person J. Arenas    schedule 10.09.2012
comment
Если у меня 73,5, когда я это делаю, я получаю 735,0, почему?   -  person J. Arenas    schedule 10.09.2012


Ответы (2)


Это вызвано другой локалью, которая указывает другой десятичный разделитель, чем вы используете (обычно он ожидает ,, а вы используете .). Просто замените любой , на . перед вызовом parseDouble(), и все будет в порядке.

person Marcin Orlowski    schedule 10.09.2012
comment
Я не могу этого сделать, потому что это приложение на разных языках, например, на английском языке вы должны использовать точку, а на испанском языке вы должны использовать запятую. - person J. Arenas; 10.09.2012

ОК, ответ использует этот код:

public double stringToDouble(String s) {

       NumberFormat nf = NumberFormat.getInstance(Locale.getDefault());
    nf.setGroupingUsed(false);
    ParsePosition parsePosition = new ParsePosition(0);
    Number n = nf.parse(s, parsePosition);
    if (n == null || parsePosition.getErrorIndex() >= 0 || parsePosition.getIndex() < s.length())
    {
      /* not a valid number */
    }
    return n.doubleValue();
}

Это работает для меня

person J. Arenas    schedule 10.09.2012