2013-07-02 4 views
8

मेरे पास EditText बॉक्स है जो उपयोगकर्ता को 7 अंकों और दो दशमलव स्थानों तक पहुंचने की अनुमति देता है। सात अंकों को दर्ज करने के बाद, इसे एक और अंक जोड़ने की अनुमति नहीं देनी चाहिए, लेकिन मैं 2 दशमलव स्थानों तक पहुंच सकता हूं। मैं एक्सएमएलएडिटटेक्स्ट लंबाई को 7 पूर्णांक और 2 दशमलव स्थानों तक सीमित कैसे करें?

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

लेकिन EditText में 2 दशमलव स्थानों के लिए एक दशमलव फिल्टर और इस कोड का उपयोग enter 8 अंक के लिए अनुमति देता है। यह कैसे हल किया जा सकता है?

+0

प्रारूप के साथ की कोशिश के लिए ... –

उत्तर

0

हालांकि नहीं एक सीधा समाधान, आप हर चरित्र है कि TextWatcher

उपयोग के बारे में इतना क्यू & एक में से एक के माध्यम से EditText के रूप IME चला जाता है नियंत्रित कर सकते हैं TextWatcherTextWatcher के बारे में here

अधिक here

है

इनपुट को सत्यापित करने के लिए आपको Regular expression to match floating point precision & pattern matcher की सहायता की आवश्यकता हो सकती है।

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

इस सही ढंग से काम नहीं करेगा अगर वहाँ एक अल्पविराम हजार विभाजक वहाँ है । अगर अंग्रेजी लोकेल का उपयोग करके एक संख्या प्रारूप का उपयोग करके संपादन को प्रारूपित किया गया है तो प्रत्येक नंबर के लिए एक अल्पविराम> 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)}); 

आप अक्षम अधिकतम मूल्य सीमा उपयोग Double.POSITIVE_INFINITY, इससे पहले कि या डॉट सिर्फ Integer.MAX_VALUE डाल के बाद अंक सीमित करने के लिए नहीं करना चाहते हैं।

आप इस फ़िल्टर का उपयोग टेक्स्ट फ़ील्ड के लिए कर सकते हैं जहां आप नंबर या संख्या और टेक्स्ट दर्ज करते हैं।

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

आप जब इस तरह एंड्रॉयड डेटा बाइंडिंग का उपयोग कर इसे बढ़ा सकते हैं:

कस्टम बाध्यकारी एडाप्टर परिभाषित करें:

@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}" 

और यह अपने आप इनपुट सेट हो जाएगा edittext के लिए फ़िल्टर

0

आप इस इनपुट फ़ाइल को उपयोगकर्ता कर सकते हैं अपनी समस्या को हल करने के लिए ter।फिल्टर सेट करने के लिए: "। ##### ##" 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)}); 
संबंधित मुद्दे