首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android EditText 獲取浮點數值的正確姿勢與避坑指南

     編輯:程式設計綜合問答

在 Android 中從 EditText 獲取浮點數值看似簡單,但若不做輸入驗證,極易因空字串或非數字字元導致應用崩潰。

問題代碼

EditText edt = (EditText) findViewById(R.id.price);
float number = Float.valueOf(edt.getText().toString()); // 危險!

崩潰原因分析

  1. 空字串:用戶未輸入內容,"" 無法轉換為浮點數
  2. 非數字字元:包含字母、符號等無效字元
  3. 格式異常:多個小數點、科學記數法等

以上情況均會拋出 NumberFormatException,導致應用強制關閉。

安全獲取方案

方案一:try-catch 防護(基礎版)

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" />

配合代碼驗證雙重保險。

方案四:TextWatcher 即時驗證

edt.addTextChangedListener(new TextWatcher() {
    @Override
    public void afterTextChanged(Editable s) {
        String input = s.toString();
        // 即時移除非法字元或提示
        if (!input.matches("-?\\d*\\.?\\d*")) {
            // 移除最後輸入的非法字元
            // 注意:需避免無限循環
        }
    }
    // beforeTextChanged, onTextChanged 留空
});

進階建議

  • 金額計算場景請使用 BigDecimal 避免浮點數精度問題
  • 考慮使用 TextInputLayout + setError() 顯示友好錯誤提示
  • 國際化場景注意小數點符號差異(部分地區用逗號)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved