EditText是Android中一个非常实用的控件,有很多InputType,可以来达到不同的输入效果,如下图:
比如,密码输入,数字输入等等。但是最近在项目中要实现EditText输入金额,金额的限制因素很多,比如,只能输入数字和小数点,首位不能输入0和小数点,小数点后面只能保留两位等等,这些仅仅用InputType是无法实现的,今天用InputFilter来实现。
1. 首先需要将EditText的InputType设置成如下格式,保证用户只能输入小数点和数字
android:inputType="numberDecimal"或者setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL)
2. 自定义InputFilter,代码如下:
CashierInputFilter.java
- package com.iscs.mobilewcs.tools;
-
- import android.text.InputFilter;
- import android.text.Spanned;
- import android.text.TextUtils;
-
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
-
- /**
- * Created by Jackie on 2017/2/22.
- * 过滤用户输入只能为金额格式
- */
- public class CashierInputFilter implements InputFilter {
- Pattern mPattern;
-
- //输入的最大金额
- private static final int MAX_VALUE = Integer.MAX_VALUE;
- //小数点后的位数
- private static final int POINTER_LENGTH = 2;
-
- private static final String POINTER = ".";
-
- private static final String ZERO = "0";
-
- public CashierInputFilter() {
- mPattern = Pattern.compile("([0-9]|\\.)*");
- }
-
- /**
- * @param source 新输入的字符串
- * @param start 新输入的字符串起始下标,一般为0
- * @param end 新输入的字符串终点下标,一般为source长度-1
- * @param dest 输入之前文本框内容
- * @param dstart 原内容起始坐标,一般为0
- * @param dend 原内容终点坐标,一般为dest长度-1
- * @return 输入内容
- */
- @Override
- public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
- String sourceText = source.toString();
- String destText = dest.toString();
-
- //验证删除等按键
- if (TextUtils.isEmpty(sourceText)) {
- return "";
- }
-
- Matcher matcher = mPattern.matcher(source);
- //已经输入小数点的情况下,只能输入数字
- if(destText.contains(POINTER)) {
- if (!matcher.matches()) {
- return "";
- } else {
- if (POINTER.equals(source.toString())) { //只能输入一个小数点
- return "";
- }
- }
-
- //验证小数点精度,保证小数点后只能输入两位
- int index = destText.indexOf(POINTER);
- int length = dend - index;
-
- if (length > POINTER_LENGTH) {
- return dest.subSequence(dstart, dend);
- }
- } else {
- /**
- * 没有输入小数点的情况下,只能输入小数点和数字
- * 1. 首位不能输入小数点
- * 2. 如果首位输入0,则接下来只能输入小数点了
- */
- if (!matcher.matches()) {
- return "";
- } else {
- if ((POINTER.equals(source.toString())) && TextUtils.isEmpty(destText)) { //首位不能输入小数点
- return "";
- } else if (!POINTER.equals(source.toString()) && ZERO.equals(destText)) { //如果首位输入0,接下来只能输入小数点
- return "";
- }
- }
- }
-
- //验证输入金额的大小
- double sumText = Double.parseDouble(destText + sourceText);
- if (sumText > MAX_VALUE) {
- return dest.subSequence(dstart, dend);
- }
-
- return dest.subSequence(dstart, dend) + sourceText;
- }
- }
使用方法如下:
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。