为何从EditText获取小数输入值时我的应用崩溃?
解决EditText转Double时的崩溃问题
崩溃的核心原因是Double.parseDouble()会在输入字符串不是有效双精度数字格式时抛出NumberFormatException,以下场景都会触发崩溃:
- 输入框为空字符串
- 输入仅含小数点(比如".")
- 输入包含非数字字符(部分地区用户习惯用逗号作为小数点分隔符,比如"3,14")
针对这些情况,可通过以下方式修改代码解决:
方案1:合法性校验+异常捕获
Editable valueEditable = edtTxt1.getText(); String valueString = valueEditable.toString().trim(); // 去除首尾空格 double value = 0.0; // 设置默认值 if (!valueString.isEmpty() && !valueString.equals(".")) { try { // 适配逗号作为小数点的输入习惯 valueString = valueString.replace(",", "."); value = Double.parseDouble(valueString); } catch (NumberFormatException e) { // 输入格式无效时的处理逻辑,比如提示用户输入正确数字 e.printStackTrace(); } }
方案2:用DecimalFormat安全解析
Editable valueEditable = edtTxt1.getText(); String valueString = valueEditable.toString().trim(); double value = 0.0; if (!valueString.isEmpty() && !valueString.equals(".")) { DecimalFormat df = new DecimalFormat("#.##########"); try { Number number = df.parse(valueString); value = number.doubleValue(); } catch (ParseException e) { e.printStackTrace(); } }
额外优化:从源头限制输入格式
可以给EditText添加输入过滤,提前限制仅允许数字和单个小数点,减少无效输入:
edtTxt1.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); // 添加过滤器限制最多一个小数点 edtTxt1.setFilters(new InputFilter[]{new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if (dest.toString().contains(".")) { if (source.toString().equals(".")) { return ""; } } return null; } }});
内容的提问来源于stack exchange,提问作者Fatima
相关产品推荐
相关产品推荐

