Android NumberFormatException: Invalid Double - за исключением того, что значение является допустимым Double

Итак, на днях в разделе «Сбои» консоли разработчика Google Play выскочила следующая ошибка:

java.lang.NumberFormatException: Invalid double: "−0.05"

Теперь поправьте меня, если я ошибаюсь, но на самом деле это действительный двойник, и он распознается как действительный двойник на моем компьютере, в эмуляторе и на моем собственном устройстве Android (Nexus 5).

Устройством, на котором он разбился, был Galaxy Note II под управлением Android 4.3. Любые идеи относительно того, почему он может сбой, пожалуйста?


person Ben Ezard    schedule 05.03.2014    source источник
comment
Покажи код. Скорее всего, пользователь работал с Locale с , в качестве десятичного разделителя. Проанализируйте свои номера с явными локалями.   -  person laalto    schedule 05.03.2014
comment
Есть хороший раздел под названием Остерегайтесь локали по умолчанию в Locale документация   -  person zapl    schedule 05.03.2014


Ответы (2)


Это или не допустимый двойной в зависимости от вашей локали. В локали US/ENGLISH -0.05 является допустимым двойным значением, но, например, в FRENCH локали это не так (должно быть -0,05 с запятой).

Вы можете увидеть это в действии с помощью:

NumberFormat fmt = NumberFormat.getNumberInstance(Locale.US);
double d = fmt.parse("-0.05").doubleValue(); //-0.05

fmt = NumberFormat.getNumberInstance(Locale.FRENCH);
d = fmt.parse("-0.05").doubleValue(); //-0.0
d = fmt.parse("-0,05").doubleValue(); //-0.05

ИЗМЕНИТЬ

Однако ваша проблема, возможно, не в этом. Знак минус недействителен. Вы используете вместо - (они выглядят одинаково, но это разные символы). Демо:

Double.parseDouble("-0.05"); //ok
Double.parseDouble("−0.05"); //exception
person assylias    schedule 05.03.2014
comment
Моя единственная проблема заключается в том, что почти 50% устройств пользователей моего приложения используют неанглийскую локаль — так почему же эта проблема возникла только один раз из тысяч устройств в течение нескольких месяцев? - person Ben Ezard; 05.03.2014
comment
@BenEzard Как вы разбираете число? Double.parseDouble? - person assylias; 05.03.2014
comment
Да, именно этот метод - и входная строка всегда форматируется с помощью '.' (гарантированно в этом формате, потому что он из файла, загруженного с моего сервера) - person Ben Ezard; 05.03.2014
comment
Маловероятно, что это проблема, так как он отлично работал на тысячах других устройств с точно таким же кодом? - person Ben Ezard; 05.03.2014
comment
@BenEzard Если вы скопируете и вставите строку в свой вопрос и попытаетесь проанализировать ее, вы получите сообщение об ошибке. Может быть, по какой-то причине строка была сгенерирована по-другому? - person assylias; 05.03.2014
comment
Действительно, вы правы, что странно, учитывая, что String извлекается из базы данных MySQL из столбца с типом данных Double. Ну, по крайней мере, мы докопались до сути - спасибо :-) - person Ben Ezard; 05.03.2014
comment
Вы столкнулись с ограничением языка Java... не то, что работает на тысячах устройств. В качестве унарного отрицательного оператора (и диадического оператора вычитания) используется только дефис, а не длинное тире. - person ErstwhileIII; 05.03.2014

Для двойных констант язык просит вас использовать форму -0.05d (с суффиксом "d"). См. здесь справку.

Также убедитесь, что символ, предназначенный для использования в качестве знака минус, является «дефисом», а не «длинным тире».

person ErstwhileIII    schedule 05.03.2014
comment
Это не обязательно, хотя - любое число с плавающей запятой без суффикса f или d автоматически определяется как двойное - действительно, в разделе литералов с плавающей запятой в вашей ссылке они пишут double d1 = 123.4; - person Ben Ezard; 05.03.2014
comment
А по поводу минуса - если на всех других устройствах работает нормально, то я полагаю, это правильный символ? - person Ben Ezard; 05.03.2014