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

标签 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);
}

请帮我解决这个问题。

最佳答案

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

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 - 在 matcher if 条件 block 中设置文本之前,您还应该删除和添加监听器(以防止它进入无限循环)。

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

关于java - 自动添加千位分隔符作为数字输入不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57020997/

相关文章:

java - 模拟不与@Secured一起使用

java - Maven:传递-循环依赖-发布流程

java - com.google.api.client.googleapis.json.GoogleJsonResponseException : 403 Forbidden

Android:RecyclerView 不显示 fragment 中的列表项

java - 无法检查 AlertDialog.Builder 中 EditText 的值

android - 具体的 EditText Android

java - 如何创建自动发票,无需生成 jtextfield

java - 具有两个键的高效数据结构

java - 为什么我的 setOnKeyListener() 不起作用?

android - EditText有两条下划线