天天看點

android edittext限制輸入小數位數,限制輸入數字大小

      在我們實際開發中,當涉及到金額輸入的時候,必定會涉及到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:這些方法都是在輸入框内容變化之前調用的,這種方式主要是對目前輸入框中的内容進行一個驗證,看是否能符合我們的規則。

代碼就不寫來,規則大緻和上面有點像,但是比上面的那種要難處理一點。