【问题标题】:Force Trailing Zeroes in EditText Android在 EditText Android 中强制使用尾随零
【发布时间】:2020-02-28 09:12:04
【问题描述】:

我使用 InputFilter 从 stackoverflow 复制代码以强制编辑文本在“。”之前有 3 位数字。和后面的 2 位数字(2 位小数)。但是,如果用户只输入 15,我希望系统显示 15.00?

所以我想要的场景是.. 编辑文本最多必须有 2 个小数位.. 例如12.56 但如果用户只输入 15 则编辑文本字段最后添加 2 个零,因此 15 -> 15.00

如何在 addTextChangedListener 中执行此操作?

stackoverflow 中关于 inputfilter 的代码

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;
  }
}
    /// in main activity
   numberReceivedEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter(3, 2)}); 
   numberReceivedEditText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

【问题讨论】:

  • 可以分享一下sn-p的代码吗?
  • 刚刚发布了代码

标签: android android-edittext addtextchangedlistener


【解决方案1】:

请试试这个

numberReceivedEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter(numberReceivedEditText)});

numberReceivedEditText.addTextChangedListener(new TextWatcher() {

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            if (i2 == 0) return;
            int cursorLocation = numberReceivedEditText.getSelectionStart();
            String data = numberReceivedEditText.getText().toString();
            if (!data.isEmpty()) {
                if (!data.contains(".")) {
                    data = data + ".";
                }

                try {
                    data = String.format(Locale.JAPANESE, "%.2f", Double.parseDouble(data));
                    numberReceivedEditText.removeTextChangedListener(this);
                    numberReceivedEditText.setText(data);
                    numberReceivedEditText.setSelection(cursorLocation < data.length() ? cursorLocation : cursorLocation - 1, cursorLocation);
                    numberReceivedEditText.addTextChangedListener(this);
                }catch (Exception e){
                    e.printStackTrace();
                }

            }
        }

        @Override
        public void afterTextChanged(Editable editable) {
        }
    });

class DecimalDigitsInputFilter implements InputFilter {

TextView tvNumber;

public DecimalDigitsInputFilter(TextView tvNumber) {
    this.tvNumber = tvNumber;
}

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

    try {
        if (Double.parseDouble(tvNumber.getText().toString()) > 1000) {
            String[] splitValue = tvNumber.getText().toString().split("\\.");
            return splitValue[0].substring(0,3) + "." + splitValue[1];
        }
    } catch (Exception e) {
        return source;
    }
    return null;
}

}

【讨论】:

  • 如果我只输入一个数字就可以了。就像 2 变成 2.00。但我也想输入更大的数字。如果用户想输入 2 位小数,我不能再使用您的代码。所以应该允许 2.45、12.78、65.45。但是当用户只输入 15 时,结果应该是 15.00 以强制 2 位小数为零
  • 嗨@ZandroZulueta,我知道我迟到了,你改变过滤器定义了吗?
  • 您好,它仍然是一个悬而未决的问题。我只是决定在将数据保存到数据库之前进行外部检查,以查看用户是否输入了 2 d.p。与否
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 2019-07-15
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
相关资源
最近更新 更多