关闭

android edittext限制输入小数位数,限制输入数字大小

标签: android edittext输入框限android edittext 输入框
5655人阅读 评论(5) 收藏 举报
分类:

      在我们实际开发中,当涉及到金额输入的时候,必定会涉及到EditText输入小数位数的问题,下面就是如何实现限制输入框后面小数位数和输入的数字大小。

       首先,我们要知道EditText的api中能够实现的这个功能需要使用哪个api。

第一种:使用InputFilter  (这个英文直译应该叫输入过滤器吧)

不废话,直接上代码,注释上很清楚。

<span style="font-size:18px;">public class EditInputFilter implements InputFilter{ 
		/**
		 * 最大数字
		 */
		public static final int MAX_VALUE = 10000;
		/**
		 * 小数点后的数字的位数
		 */
		public static final int PONTINT_LENGTH = 2;
		Pattern p;
		public EditInputFilter(){   
			p = Pattern.compile("[0-9]*");   //除数字外的其他的
		}   

		/**
		 *  source    新输入的字符串   
		 *  start    新输入的字符串起始下标,一般为0    
		 *  end    新输入的字符串终点下标,一般为source长度-1    
		 *  dest    输入之前文本框内容    
		 *  dstart    原内容起始坐标,一般为0    
		 *  dend    原内容终点坐标,一般为dest长度-1
		 */

		@Override  
		public CharSequence filter(CharSequence src, int start, int end,   
				Spanned dest, int dstart, int dend) {   
			String oldtext =  dest.toString();
			System.out.println(oldtext);
			//验证删除等按键
			if ("".equals(src.toString())) {   
				return null;
			}
			//验证非数字或者小数点的情况
			Matcher m = p.matcher(src); 
			if(oldtext.contains(".")){
				//已经存在小数点的情况下,只能输入数字
				if(!m.matches()){
					return null;
				}
			}else{
				//未输入小数点的情况下,可以输入小数点和数字
				if(!m.matches() && !src.equals(".") ){
					return null;
				} 
			}
			//验证输入金额的大小
			if(!src.toString().equals("")){
				double dold = Double.parseDouble(oldtext+src.toString());
				if(dold > MAX_VALUE){
					CustomerToast.showToast(RechargeActivity.this, "输入的最大金额不能大于MAX_VALUE");
					return dest.subSequence(dstart, dend);
				}else if(dold == MAX_VALUE){
					if(src.toString().equals(".")){
						CustomerToast.showToast(RechargeActivity.this, "输入的最大金额不能大于MAX_VALUE");
						return dest.subSequence(dstart, dend);
					}
				}
			}
			//验证小数位精度是否正确
			if(oldtext.contains(".")){
				int index = oldtext.indexOf(".");
				int len = dend - index;	
				//小数位只能2位
				if(len > PONTINT_LENGTH){
					CharSequence newText = dest.subSequence(dstart, dend);
					return newText;
				}
			}
			return dest.subSequence(dstart, dend) +src.toString();
		}   
	} </span><span style="font-size:24px;"> </span>
 

*ps:CustomerToast只是一个稍微配置了一下的Toast控件,避免有多个提醒的时候,会接连不断的出现。


使用方式:

InputFilter[] filters = { new EditInputFilter() };  
edit.setFilters(filters);

你也可以吧上面的过滤器拆分为多个过滤器!这样以后有其他的需求的时候就可以自由混搭了!!


第二种 方式:addTextChangedListener(textwatcher),这种方式是对输入框添加一个内容监听,其中TextWatcher实现类中需要重写三个方法,

onTextChanged,beforeTextChanged,afterTextChanged,分别对应的是在edittext内容变化时,变化前,和变化后。ps:这些方法都是在输入框内容变化之前调用的,这种方式主要是对当前输入框中的内容进行一个验证,看是否能符合我们的规则。

代码就不写来,规则大致和上面有点像,但是比上面的那种要难处理一点。



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:13962次
    • 积分:252
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:3篇
    • 译文:0篇
    • 评论:6条
    文章分类