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

如何修复Android中输入".52"触发的java.lang.NumberFormatException异常?

解决输入无前导零小数导致的NumberFormatException问题

你的代码在处理.52这类无前导零的小数时崩溃,核心原因是Float.parseFloat()无法解析这种格式的输入字符串,以下是两种可行的解决方法:

方法一:预处理输入字符串,补全前导零

编写一个工具方法,对输入字符串进行预处理,给无前导零的小数补上前导零,同时处理空输入、负号开头的小数等异常情况:

private float parseInput(String input) {
    if (input == null || input.trim().isEmpty()) {
        return 0.0f;
    }
    String trimmedInput = input.trim();
    // 处理以小数点开头的情况,比如".52"转为"0.52"
    if (trimmedInput.startsWith(".")) {
        trimmedInput = "0" + trimmedInput;
    }
    // 处理以负号加小数点开头的情况,比如"-.52"转为"-0.52"
    else if (trimmedInput.startsWith("-.")) {
        trimmedInput = "-0" + trimmedInput.substring(1);
    }
    return Float.parseFloat(trimmedInput);
}

修改原有代码,替换Float.parseFloat调用:

float l = parseInput(etLength.getText().toString());
float b = parseInput(etBreadth.getText().toString());
float d = parseInput(etDepth.getText().toString());
pitSize.setText(String.valueOf(l * b * d));

方法二:使用DecimalFormat解析输入

DecimalFormat原生支持无前导零的小数格式,通过它来解析输入可以避免手动预处理:

import java.text.DecimalFormat;
import java.text.ParseException;

// ...

private float parseInput(String input) {
    if (input == null || input.trim().isEmpty()) {
        return 0.0f;
    }
    DecimalFormat df = new DecimalFormat();
    df.setParseBigDecimal(false);
    try {
        return df.parse(input.trim()).floatValue();
    } catch (ParseException e) {
        e.printStackTrace();
        return 0.0f;
    }
}

同样将原有代码中的Float.parseFloat替换为这个工具方法即可。

额外优化:限制EditText输入格式

可以给EditText设置输入过滤器,从源头限制只能输入合法的数字格式,减少异常输入的概率:

import android.text.InputFilter;
import android.text.Spanned;

// ...

// 创建输入过滤器,允许数字、小数点、负号,且格式合法
InputFilter numberFilter = new InputFilter() {
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        String newInput = dest.subSequence(0, dstart) + source.subSequence(start, end) + dest.subSequence(dend, dest.length());
        // 正则匹配:允许空、正负号开头的整数/小数(包括无前导零的小数)
        if (newInput.matches("^-?\\d*\\.?\\d*$")) {
            return null;
        }
        return "";
    }
};

// 给三个EditText设置过滤器
etLength.setFilters(new InputFilter[]{numberFilter});
etBreadth.setFilters(new InputFilter[]{numberFilter});
etDepth.setFilters(new InputFilter[]{numberFilter});

内容的提问来源于stack exchange,提问作者ashish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:30:50