我有一个EditText,其inputType为 number 。用户输入时,我要用逗号分隔数字。这是一个小例子:
123将表示为123
1234将表示为1,234
12345将表示为12,345
...等等。
我尝试使用TextWatcher添加逗号,如下所示:
EditText edittext = findViewById(R.id.cashGiven);
edittext.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) {
}
@Override
public void afterTextChanged(Editable editable) {
editText.setText(separateWithComma(editText.getText().toString().trim()));
}
});
在此处粘贴separateWithComma()
方法会使这个问题变得冗长,但随后它起作用了:我在Eclipse上对其进行了测试。我认为addTextChangedListener无法以这种方式工作,因为执行此操作时我的应用程序冻结(然后崩溃)。
是否有更好的方法来实现这一目标?谢谢您的积极回应。
答案 0 :(得分:1)
尝试使用String.format
代替现在的内容。
替换此:
editText.setText(separateWithComma(editText.getText().toString().trim()));
与此:
editText.setText(String.format("%,d", your number));
另一件事-您的应用可能会崩溃,因为每次您在setText()
内部调用afterTextChanged
时,都会调用另一个afterTextChanged
,并且基本上会创建一个无限循环。如果那是您的问题,您可以找到一个好的解决方案in here。
答案 1 :(得分:1)
尝试以下代码:
et.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
et.removeTextChangedListener(this);
try {
String givenstring = s.toString();
Long longval;
if (givenstring.contains(",")) {
givenstring = givenstring.replaceAll(",", "");
}
longval = Long.parseLong(givenstring);
DecimalFormat formatter = new DecimalFormat("#,###,###");
String formattedString = formatter.format(longval);
et.setText(formattedString);
et.setSelection(et.getText().length());
// to place the cursor at the end of text
} catch (NumberFormatException nfe) {
nfe.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
et.addTextChangedListener(this);
}
});
答案 2 :(得分:1)
我已经得到了两个很好的答案,但我只想添加以下内容:
我遇到此问题的原因是因为editText.setText(...)
在TextWatcher的afterTextChanged()
函数中被递归调用。正如前面的回答者所正确指出的那样,解决方案是通过这种方式暂时停止触发afterTextChanged()
方法:
boolean edit = true;
...
@Override
public void afterTextChanged(Editable editable){
if(edit){
edit = false;
editText.setText(String.format("%,d", Integer.parseInt(editText.getText().toString().trim())));
edit = true;
}
}
这样,我们就仔细地蜿蜒了。但这带来了一个新问题:
使用此策略,我们假定EditText中的字符串可以轻松转换为int
。当我们输入更多数字时,该应用肯定会由于逗号而崩溃,并出现NumberFormatException。因此,找到解决该问题的方法很重要。这是我写的帮助我的方法:
public int getCommalessNumber(String commaNumber){
String newNumber = "";
String[] split = commaNumber.trim().split(",");
for(int i = 0; i < split.length; i++){
newNumber += split[i];
}
return newNumber;
}
最后,我们可以这样做:
boolean edit = true;
...
@Override
public void afterTextChanged(Editable editable){
if(edit){
edit = false;
editText.setText(String.format("%,d", Integer.parseInt(getCommalessNumber(editText.getText().toString().trim()))));
edit = true;
}
}
我希望这可以帮助某个人。编码愉快!
答案 3 :(得分:0)
对于可能要使用此方法的用户,请将getCommalessNumber(String commaNumber)方法的返回类型更改为String而不是int。