如何修复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
相关产品推荐
相关产品推荐

