我需要自动添加千位分隔符作为数字输入。
我尝试编写一些代码,但没有用。当我以编程方式设置文本以编辑文本时,它工作正常,但是当用户键入数字时,未添加千位分隔符。这是我的代码:
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/