在 Android 中從 EditText 獲取浮點數值看似簡單,但若不做輸入驗證,極易因空字串或非數字字元導致應用崩潰。
EditText edt = (EditText) findViewById(R.id.price);
float number = Float.valueOf(edt.getText().toString()); // 危險!
"" 無法轉換為浮點數以上情況均會拋出 NumberFormatException,導致應用強制關閉。
EditText edt = (EditText) findViewById(R.id.price);
String input = edt.getText().toString().trim();
float number = 0f;
try {
if (!input.isEmpty()) {
number = Float.parseFloat(input);
}
} catch (NumberFormatException e) {
// 處理格式錯誤:提示用戶、設置預設值等
Toast.makeText(this, "請輸入有效數字", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
String input = edt.getText().toString().trim();
// 正則:可選負號 + 數字 + 可選小數部分
if (input.matches("-?\\d+(\\.\\d+)?")) {
float number = Float.parseFloat(input);
// 繼續業務邏輯
} else {
Toast.makeText(this, "格式錯誤:請輸入有效數字", Toast.LENGTH_SHORT).show();
}
在 XML 佈局中直接限制輸入類型:
<EditText
android:id="@+id/price"
android:inputType="numberDecimal|numberSigned"
android:digits="0123456789.-"
android:maxLength="10" />
配合代碼驗證雙重保險。
edt.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
String input = s.toString();
// 即時移除非法字元或提示
if (!input.matches("-?\\d*\\.?\\d*")) {
// 移除最後輸入的非法字元
// 注意:需避免無限循環
}
}
// beforeTextChanged, onTextChanged 留空
});
BigDecimal 避免浮點數精度問題TextInputLayout + setError() 顯示友好錯誤提示