我需要自动添加千位分隔符作为数字输入。
我尝试编写一些代码,但这是行不通的。当我以编程方式将文本设置为编辑文本时,它工作正常,但是当用户键入数字千位分隔符时未添加。这是我的代码:
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);
}
请帮助我解决这个问题。
答案 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);