Android Float.parseFloat приводит к неустранимой ошибке из-за десятичной точки

#android

#Android

Вопрос:

Я использую следующий код для разбора значения с плавающей запятой из строки:

  EditText CurrPLC = (EditText) findViewById(R.id.CurrPLC);
 String s5 = CurrPLC.getText().toString();
 float F5 = Float.parseFloat(s5);
  

Это отлично работает, пока я не попытаюсь записать отрицательное значение в EditText . Поскольку символ «минус» находится на той же кнопке, что и десятичная точка, я сначала записываю десятичную дробь, а затем приложение вылетает, потому что строка «.» не может быть преобразована в значение с плавающей запятой. Код выполняется при любом изменении текста в EditText

Вот EditText код из файла макета:

  <EditText
            android:id="@ id/CurrPLC"
            android:layout_width="100dp"
            android:layout_height="30dp"
            android:padding="2dp"
            android:hint="eg. 3277"
            android:gravity="center_horizontal"
            android:layout_gravity="right"
            android:textSize="13sp"
            android:digits="-0123456789."
            android:inputType="numberSigned|numberDecimal"
            android:maxLength="10"
            android:background="@drawable/plc_edit_text_holo_light"
            android:layout_marginRight="19dp"
            android:layout_marginEnd="19dp"
            android:layout_alignBaseline="@ id/CurrPLCLabel"
            android:layout_alignBottom="@ id/CurrPLCLabel"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true" />
        />
  

Я что-то сделал не так, или это просто обработка этого до возникновения ошибки?

Спасибо

Комментарии:

1. В какой момент вы анализируете значение с плавающей запятой? Вы используете TextWatcher или при нажатии кнопки? Я не понимаю, что вы имеете в виду под the "negative" symbol is on the same button as the decimal point

2. @AbtinGramian Да, я использую TextWatcher , поэтому он обновляется при каждом нажатии клавиши. Чтобы поместить «отрицательный» символ (-) на ту же кнопку, что и десятичная точка, вы должны дважды нажать кнопку с десятичной запятой. Это просто стандартная цифровая клавиатура Android

Ответ №1:

Основываясь на вашем комментарии об использовании TextWatcher , которое пыталось бы анализировать значение с плавающей запятой при каждом нажатии клавиши, проблема не в отрицательных числах.

parseFloat() будет нормально работать с отрицательными числами. Проблема в пустой строке или - , -. или . , скорее всего.

Поэтому вы не должны выполнять синтаксический анализ при каждом нажатии клавиши, а вместо этого делайте это только там, где вам это нужно (я не уверен в вашем полном варианте использования, поэтому я не могу прокомментировать подходящее время и место для разбора float). В противном случае вам нужно добавить try / catch для java.lang.NumberFormatException везде, где вы в данный момент анализируете значение с плавающей запятой.