自动添加千位分隔符作为数字输入不起作用

时间:2019-07-13 16:36:06

标签: java android android-edittext

我需要自动添加千位分隔符作为数字输入。

我尝试编写一些代码,但这是行不通的。当我以编程方式将文本设置为编辑文本时,它工作正常,但是当用户键入数字千位分隔符时未添加。这是我的代码:

EditText etEdit;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        etEdit = findViewById(R.id.et_edit);
        setListeners();
        etEdit.setText("500000");

    }

    private void setListeners() {
        etEdit.addTextChangedListener(new TextWatcher() {
            int after = 0;
            @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 ((i1 + i2) > charSequence.length()) {
                    after = i2;
                } else {
                    after = i + i2;
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {
                if (editable.length() > 0) {
                    Pattern mPattern = Pattern.compile("([1-9][0-9]*?)");
                    Matcher matcher = mPattern.matcher(editable.toString().replace(String.valueOf((char) 160), "").trim());
                    if (!matcher.matches()) {
                        if (!(etEdit.getText().toString().equals(""))) {
                            etEdit.setText(etEdit.getText().subSequence(0, etEdit.getText().length() - 1));
                            etEdit.setSelection(etEdit.getText().length());
                        }
                    }
                    if (after != 0) {
                        etEdit.setSelection(after);
                    }
                    if (!(etEdit.getText().toString().equals(""))) {
                        etEdit.removeTextChangedListener(this);
                        etEdit.setText(thousandSeparators(Double.valueOf(etEdit.getText().toString().replace(String.valueOf((char) 160), "").trim())));
                    }
                }
            }
        });
    }

private   String thousandSeparators(double value) {
    DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols(Locale.getDefault());
    formatSymbols.setGroupingSeparator((char) 160);
    DecimalFormat format = new DecimalFormat("#,###,###", formatSymbols);
    return format.format((int) value);
}

请帮助我解决这个问题。

1 个答案:

答案 0 :(得分:1)

您在设置textChangedListener中的文本之前删除了afterTextChanged,但此后没有添加。

if (!(etEdit.getText().toString().equals(""))) {
  etEdit.removeTextChangedListener(this);
  etEdit.setText(thousandSeparators(Double.valueOf(etEdit.getText().toString().replace(String.valueOf((char) 160), "").trim())));
  etEdit.addTextChangedListener(this);
}

P.S-您还应该在条件块中在匹配器中设置文本之前删除并添加侦听器(以防止其陷入无限循环)。

  etEdit.removeTextChangedListener(this);
  etEdit.setText(etEdit.getText().subSequence(0, etEdit.getText().length() - 1));
  etEdit.addTextChangedListener(this);