2013-07-02 207 views
8

我有一個EditText框,它必須允許用戶輸入多達7個數字和兩個小數位。輸入七位數字後,不應允許再添加一位數字,但我可以允許多達兩位小數位。我用了2個小數位小數過濾器和該代碼XML如何將EditText長度限制爲7個整數和2個小數位?

android:maxLength="7"  
android:imeOptions="actionDone"     
android:inputType="numberDecimal" 

EditText被允許enter 8位數字。這怎麼解決?

+0

嘗試用格式... –

回答

4
edittext.setFilters(new InputFilter[] { new DigitsKeyListener(
       Boolean.FALSE, Boolean.TRUE) { 
      int beforeDecimal = 7, afterDecimal = 2; 

      @Override 
      public CharSequence filter(CharSequence source, int start, int end, 
        Spanned dest, int dstart, int dend) { 
       String etText = edittext.getText().toString(); 
       if (etText.isEmpty()){ 
        return null; 
       } 
       String temp = edittext.getText() + source.toString(); 
       if (temp.equals(".")) { 
        return "0."; 
       } else if (temp.toString().indexOf(".") == -1) { 
        // no decimal point placed yet 
        if (temp.length() > beforeDecimal) { 
         return ""; 
        } 
       } else { 
        int dotPosition ; 
        int cursorPositon = edittext.getSelectionStart(); 
        if (etText.indexOf(".") == -1) { 
         Log.i("First time Dot", etText.toString().indexOf(".")+" "+etText); 
         dotPosition = temp.indexOf("."); 
         Log.i("dot Positon", cursorPositon+""); 
         Log.i("dot Positon", etText+""); 
         Log.i("dot Positon", dotPosition+""); 
        }else{ 
         dotPosition = etText.indexOf("."); 
         Log.i("dot Positon", cursorPositon+""); 
         Log.i("dot Positon", etText+""); 
         Log.i("dot Positon", dotPosition+""); 
        } 
        if(cursorPositon <= dotPosition){ 
         Log.i("cursor position", "in left"); 
         String beforeDot = etText.substring(0, dotPosition); 
         if(beforeDot.length()<beforeDecimal){ 
          return source; 
         }else{ 
          if(source.toString().equalsIgnoreCase(".")){ 
           return source; 
          }else{ 
           return ""; 
          } 

         } 
        }else{ 
         Log.i("cursor position", "in right"); 
         temp = temp.substring(temp.indexOf(".") + 1); 
         if (temp.length() > afterDecimal) { 
          return ""; 
         } 
        } 
       } 

       return super.filter(source, start, end, dest, dstart, dend); 
      } 
     } }); 
18

在你的程序

public class DecimalDigitsInputFilter implements InputFilter { 

     Pattern mPattern; 

     public DecimalDigitsInputFilter(int digitsBeforeZero,int digitsAfterZero) { 
      mPattern=Pattern.compile("[0-9]{0," + (digitsBeforeZero-1) + "}+((\\.[0-9]{0," + (digitsAfterZero-1) + "})?)||(\\.)?"); 
     } 

     @Override 
     public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 

       Matcher matcher=mPattern.matcher(dest);  
       if(!matcher.matches()) 
        return ""; 
       return null; 
      } 

     } 
1
public class DecimalDigitsInputFilter implements InputFilter { 

    Pattern mPattern; 
    int digitsBeforeZero; 

    public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero) { 
     this.digitsBeforeZero = digitsBeforeZero; 
     mPattern = Pattern.compile("[0-9]{0," + (digitsBeforeZero - 1) + "}+((\\.[0-9]{0," + (digitsAfterZero - 1) + "})?)||(\\.)?"); 
    } 

    @Override 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 

     Matcher matcher = mPattern.matcher(dest); 
     if (!matcher.matches()) { 
      if (dest.toString().contains(".")) { 
       if (dest.toString().substring(dest.toString().indexOf(".")).length() > 2) { 
        return ""; 
       } 
       return null; 
      } else if (!Pattern.compile("[0-9]{0," + (digitsBeforeZero - 1) + "}").matcher(dest).matches()) { 
       if (!dest.toString().contains(".")) { 
        if (source.toString().equalsIgnoreCase(".")) { 
         return null; 
        } 
       } 
       return ""; 
      } else { 
       return null; 
      } 
     } 

     return null; 
    } 
} 
+0

這將無法正常,如果有一個逗號千個爲分隔符是那裏工作。假設edittext使用英文語言環境的數字格式進行格式化,每個數字> 999的逗號將會變爲逗號,這些數字將與您的模式不匹配,因此當將數字4,500.00更改爲5600時,只會顯示600。 – KJEjava48

1

您可以使用的此輸入濾波器解決你的問題試試這個的onCreate

youreditText.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(5,1)}); 

這下的任何地方。 要設置過濾器:

mEditText.setFilters(new InputFilter[]{new DigitsInputFilter(maxDigitsBeforeDot, maxDigitsAfterDot, maxValue)}); 

如果不想之前或點只是把Integer.MAX_VALUE後限制數字,到禁用最大值限制使用Double.POSITIVE_INFINITY

對於輸入數字或數字和文本的文本字段,您可以使用此過濾器。

public class DigitsInputFilter implements InputFilter { 

    private final String DOT = "."; 

    private int mMaxIntegerDigitsLength; 
    private int mMaxDigitsAfterLength; 
    private double mMax; 


    public DigitsInputFilter(int maxDigitsBeforeDot, int maxDigitsAfterDot, double maxValue) { 
     mMaxIntegerDigitsLength = maxDigitsBeforeDot; 
     mMaxDigitsAfterLength = maxDigitsAfterDot; 
     mMax = maxValue; 
    } 

    @Override 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 
     String allText = getAllText(source, dest, dstart); 
     String onlyDigitsText = getOnlyDigitsPart(allText); 

     if (allText.isEmpty()) { 
      return null; 
     } else { 
      double enteredValue; 
      try { 
       enteredValue = Double.parseDouble(onlyDigitsText); 
      } catch (NumberFormatException e) { 
       return ""; 
      } 
      return checkMaxValueRule(enteredValue, onlyDigitsText); 
     } 
    } 


    private CharSequence checkMaxValueRule(double enteredValue, String onlyDigitsText) { 
     if (enteredValue > mMax) { 
      return ""; 
     } else { 
      return handleInputRules(onlyDigitsText); 
     } 
    } 

    private CharSequence handleInputRules(String onlyDigitsText) { 
     if (isDecimalDigit(onlyDigitsText)) { 
      return checkRuleForDecimalDigits(onlyDigitsText); 
     } else { 
      return checkRuleForIntegerDigits(onlyDigitsText.length()); 
     } 
    } 

    private boolean isDecimalDigit(String onlyDigitsText) { 
     return onlyDigitsText.contains(DOT); 
    } 

    private CharSequence checkRuleForDecimalDigits(String onlyDigitsPart) { 
     String afterDotPart = onlyDigitsPart.substring(onlyDigitsPart.indexOf(DOT), onlyDigitsPart.length() - 1); 
     if (afterDotPart.length() > mMaxDigitsAfterLength) { 
      return ""; 
     } 
     return null; 
    } 

    private CharSequence checkRuleForIntegerDigits(int allTextLength) { 
     if (allTextLength > mMaxIntegerDigitsLength) { 
      return ""; 
     } 
     return null; 
    } 

    private String getOnlyDigitsPart(String text) { 
     return text.replaceAll("[^0-9?!\\.]", ""); 
    } 

    private String getAllText(CharSequence source, Spanned dest, int dstart) { 
     String allText = ""; 
     if (!dest.toString().isEmpty()) { 
      if (source.toString().isEmpty()) { 
       allText = deleteCharAtIndex(dest, dstart); 
      } else { 
       allText = new StringBuilder(dest).insert(dstart, source).toString(); 
      } 
     } 
     return allText; 
    } 

    private String deleteCharAtIndex(Spanned dest, int dstart) { 
     StringBuilder builder = new StringBuilder(dest); 
     builder.deleteCharAt(dstart); 
     return builder.toString(); 
    } 
} 

我希望它可以幫助你。

0

採用Android的數據綁定這樣的時候你可以提高它:

定義自定義綁定適配器:

@BindingAdapter({"digitsBeforeZero", "digitsAfterZero"}) 
public void bindAmountInputFilter(EditText view, int digitsBeforeZero, int digitsAfterZero) { 
     view.setFilters(new InputFilter[]{new DecimalDigitsInputFilter(digitsBeforeZero, digitsAfterZero)}); 
} 

添加屬性的EditText:

app:digitsBeforeZero="@{7}" 
app:digitsAfterZero="@{2}" 

,它會自動設置輸入過濾器的編輯文本

0

你可以用這個輸入fil解決你的問題。要設置過濾器:「##### ##」 對於4位和兩個小數點

public class DecimalDigitsInputFilter implements InputFilter { 

    Pattern mPattern; 

    public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero) { 
     mPattern = Pattern.compile("[0-9]{0," + (digitsBeforeZero - 1) + "}+((\\.[0-9]{0," + (digitsAfterZero - 1) + "})?)||(\\.)?"); 
    } 

    @Override 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 

     String s = Html.toHtml(dest).replaceAll("\\<.*?>","").replaceAll("\n",""); 
     Matcher matcher = mPattern.matcher(dest); 
     if (!matcher.matches()) 
      return ""; 
     try { 
      if(Double.parseDouble(s)<9999.99 && s.contains(".")) { 
       return null; 
      }else if ((Double.parseDouble(s)<1000 && !s.contains("."))||source.equals(".")) { 
       return null; 
      }else { 
       return ""; 
      } 
     }catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

} 

    editText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter(7, 2)}); 
相關問題