You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:20:49