NumberFormatException: для входной строки: "5,2"


Пожалуйста, помогите мне с этим вопросом. Я добавляю фрагмент кода и журнал сбоев здесь.

Код:

if (rssi <= -30 && rssi >= -90) {
    double len = ((rssi + 20) * -1) / 10.0;
    DecimalFormat decimalFormat = new DecimalFormat("#.##");
    float twoDigitsF = Float.valueOf(decimalFormat.format(len));
    return String.valueOf(twoDigitsF);
}

Я получаю исключение в строке

float twoDigitsF = Float.valueOf(decimalFormat.format(len));

Здесь я прикрепляю свои журналы

Fatal Exception: java.lang.NumberFormatException: For input string: "5,2"
       at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1306)
       at java.lang.Float.valueOf(Float.java:424)
       at com.app.package.utils.Util.getRange(Util.java:26)
       at com.app.package.DriverActivity.scanDone(SampleActivity.java:982)
       at com.app.package.DriverActivity.access$1300(SampleActivity.java:126)
       at com.app.package.DriverActivity$11.onScanned(SampleActivity.java:913)
       at com.appchannel.bluetooth.BHelper$1.run(BHelper.java:67)
       at android.os.Handler.handleCallback(Handler.java:751)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:154)
       at android.app.ActivityThread.main(ActivityThread.java:6317)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)

Я получил этот журнал от Crashlytics. Я не могу воспроизвести эту проблему на своем устройстве.

3 3

3 ответа:

В зависимости от того, какой язык установлен, символ между целой частью и дробной частью десятичного числа может быть либо ., ,, или что-то еще, о чем я не знаю.

DecimalFormat автоматически использует символ, соответствующий вашей локали, поэтому он форматируется в такие вещи, как 5,2 вместо 5.2.

Однако valueOf не принимает во внимание локали. Он ищет . в качестве разделителя. Поэтому, поставив 5,2 in there,valueOf` не может узнать его.

Чтобы заставить десятичный формат форматироваться так, чтобы результат был совместим с valueOf, попробуйте создать DecimalFormat с этим:

new DecimalFormat("#.##", DecimalFormatSymbols.getInstance(Locale.US));

Правка:

Я видел, что вы снова преобразуете поплавок в строку и возвращаете его. Почему бы вам просто не вернуть возвращаемое значение format?
return decimalFormat.format(len);

5,2 не является двойным или плавающим значением ,поэтому вы должны фильтровать значение ошибки ! tosetting поле TextView помощью свойства inputType !

Нет необходимости использовать десятичный формат.

yourfloat*=100f;
yourfloat = Math.round(yourfloat);
yourfloat =  yourfloat/100f;