前段时间,应客户需求,在输入框输入内容时(因为要输入年利率,会涉及到小数),需要控制输入内容的小数位的位数,第一反应时间就是百度搜索,找到了一个,看评分还挺高了,于是就用着,一直到项目上线。最近,客户又提出需求,不仅控小数位还需要控整数位,之前那个过滤器并不满足需求,只能重新写一个。在开发的过程中,我参考前期的过滤器逻辑,我竟然发现一个问题,之前的那个过滤器是有bug的,连续输入两个小数点会出现程序崩溃,这么大的bug竟然没有被测试出来,我也是醉了。于是,我就自己写了一个,不仅可以控制小数位还可以控制整数位的位数,希望能够帮助到正在为这些头疼的兄弟们!(本例中整数位控了5位,小数位控了两位,位数可自行调整)
下面贴出我写的代码:
import android.text.InputFilter; import android.text.Spanned; import com.yuntongxun.common.utils.ToastUtil; import java.util.regex.Pattern; /** * @author xyj * <p> * 整数位10位 小数位2 位 可自行调整 * @time 2017/1/3 17:09 */ public class PointLengthFilter implements InputFilter { /** * 输入框小数的位数 示例保留一位小数 */ private int digit = 2; String digitInteger = "1000"; private boolean isWhole = false; public PointLengthFilter() { } public PointLengthFilter(int digit, boolean isWhole) { this.isWhole = isWhole; this.digit = digit; } public PointLengthFilter(String digitInteger) { this.digitInteger = digitInteger; } public PointLengthFilter(String digitInteger, int digit) { this.digitInteger = digitInteger; this.digit = digit; } public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { // 删除等特殊字符,直接返回 if ("".equals(source.toString()) || !(isNumeric(source.toString()) || source.equals(".") && dstart == 0)) { return null; } if (source.equals(".") && dstart == 0) { return ""; } String dValue = dest.toString(); int pointIndex = dValue.indexOf("."); if (pointIndex == 0) { return null; } String[] splitArray = dValue.split("\\."); String value; if (dValue.contains(".")) { value = dValue; } else { if (!source.toString().equals(".")) { value = dValue + source.toString(); } else { value = dValue; } } double dold = Double.parseDouble(value); if (!isWhole){ if (dold > Double.parseDouble(digitInteger)) { if (digitInteger.equals("1000")) { ToastUtil.showMessage("整数位只能为3位!"); } else if (digitInteger.equals("100000")) { ToastUtil.showMessage("整数位只能为5位!"); } else if (digitInteger.equals("99.99999")) { ToastUtil.showMessage("整数位只能为2位!"); } return dest.subSequence(dstart, dend); } } if (splitArray.length > 1) { String dotValue = splitArray[1]; int diff = dotValue.length() + 1 - digit; if (diff > 0 && dstart > pointIndex) { if (digit == 2) { ToastUtil.showMessage("小数位最多只能为2位!"); } else if (digit == 4) { ToastUtil.showMessage("小数位最多只能为4位!"); } return source.subSequence(start, end - diff); } } return null; } public static boolean isNumeric(String str) { Pattern pattern = Pattern.compile("[0-9]*"); return pattern.matcher(str).matches(); }