【问题标题】:How to limit digits before and after point in numberdecimal EditText如何在numberdecimal EditText中限制点前后的数字
【发布时间】:2017-03-04 23:13:55
【问题描述】:

我有一个带有单个数字十进制 EditText 的应用程序。我想过滤点之前的数字,从 1 到 120。我想允许用户在点之后输入一位数字。 示例:用户可以输入 1、2.3、23、45.7、89.6、119.9、120.0 等。 用户不能输入 3.34、45.76、89.652、120.00、121.00 等。 我怎么能做那个过滤器?请根据我的条件写给我使用EditText 的过滤器)

【问题讨论】:

    标签: android filter android-edittext numbers digit


    【解决方案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();
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以在TextWatcheronTextChanged 方法中实现您的逻辑

      editText.addTextChangedListener(new TextWatcher() {
      
             @Override
             public void afterTextChanged(Editable s) {}
      
             @Override    
             public void beforeTextChanged(CharSequence s, int start,
               int count, int after) {
             }
      
             @Override    
             public void onTextChanged(CharSequence s, int start,
      
             }
            });
      

      更新 对于开始你可以使用这样的东西:

      editText.addTextChangedListener(new TextWatcher() {
      
                  boolean ignoreChange = false;
      
                  @Override
                  public void afterTextChanged(Editable s) {}
      
                  @Override
                  public void beforeTextChanged(CharSequence s, int start,
                                                int count, int after) {
                  }
      
                  @Override
                  public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
      
                      if (!ignoreChange) {
                          String string = charSequence.toString();
      
                          String[] parts = string.split("\\.");
                          if (parts.length > 1) {
                              String digitsAfterPoint = parts[1];
                              if (digitsAfterPoint.length() > 1) {
                                  ignoreChange = true;
                                  editText.setText(string.substring(0, string.indexOf(".") + 2));
                                  editText.setSelection(editText.getText().length());
                                  ignoreChange = false;
                              }
                          }
                      }
      
                  }
      
              });
      

      但是你也应该控制“.”的重复。符号或其他东西。

      更新 #2 例如,您可以使用该代码:

              editText.addTextChangedListener(new TextWatcher() {
      
                  boolean ignoreChange = false;
                  String beforeChange;
      
                  @Override
                  public void afterTextChanged(Editable s) {}
      
                  @Override
                  public void beforeTextChanged(CharSequence charSequence, int start,
                                                int count, int after) {
                  }
      
                  @Override
                  public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
      
                      if (!ignoreChange) {
                          String string = charSequence.toString();
      
                          String[] parts = string.split("\\.");
                          if (parts.length > 1) {
                              String digitsAfterPoint = parts[1];
                              if (digitsAfterPoint.length() > 1) {
                                  ignoreChange = true;
                                  editText.setText(string.substring(0, string.indexOf(".") + 2));
                                  editText.setSelection(editText.getText().length());
                                  ignoreChange = false;
                              }
                          }
      
                          String strValue = editText.getText().toString();
                          float value = Float.valueOf(strValue);
                          if (value < 1 || value > 120) {
                              ignoreChange = true;
                              editText.setText(beforeChange);
                              editText.setSelection(editText.getText().length());
                              ignoreChange = false;
                          }
                          beforeChange = editText.getText().toString();
                      }
      
                  }
      

      但是你应该携带正确的值输入。并为每个数字考虑NumberPickerSpinner

      【讨论】:

      • 你能给我我需要的过滤器代码吗?我是android编程新手
      • 谢谢,但是如何使用您的代码过滤小数点前的数字?附言查看我更新的问题:stackoverflow.com/questions/40210803/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2014-06-06
      • 1970-01-01
      • 2011-03-21
      相关资源
      最近更新 更多