如何在EditText中用逗号分隔数字

问题描述 投票:3回答:4

我有一个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无法以这种方式工作,因为当我这样做时,我的应用程序会冻结(然后在以后崩溃)。

是否有更好的方法来实现这一目标?谢谢您的积极回应。

android android-edittext number-formatting
4个回答
2
投票

尝试使用String.format,而不是现在的内容。替换为:

editText.setText(separateWithComma(editText.getText().toString().trim()));

with this:

editText.setText(String.format("%,d", your number));

[另一件事-您的应用可能会崩溃,因为每次在setText()中调用afterTextChanged时,都会调用另一个afterTextChanged,并且基本上会创建一个无限循环。如果这是您的问题,那么您可以找到一个好的解决方案in here


2
投票

尝试此代码:

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);

            }
        });

See this post


2
投票

我已经得到两个很好的答案,但是我只想添加这个:

我面临此问题的原因是,在我的TextWatcher的editText.setText(...)函数中递归调用了afterTextChanged()。正如前面的回答者正确地指出的那样,解决方案是通过这种方式暂时停止afterTextChanged()方法的触发

private boolean edit = true;
private int cursorPosition;

...
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count){}

@Override
public void afterTextChanged(Editable editable){
    if(edit){
        edit = false;
        editText.setText(String.format("%,d", Integer.parseInt(editText.getText().toString().trim())));
        edit = true;
    }
    //setting the cursor back to where it was          
    editText.setSelection(editText.getText().toString().length() - cursorPosition);
}

这样,我们已经仔细地蜿蜒了。但这带来了一个新问题:

使用此策略,我们假定EditText中的字符串可以轻松转换为int。当我们输入更多数字时,由于逗号的原因,该应用肯定会由于NumberFormatException崩溃。因此,找到解决此问题的方法很重要。这是我写的帮助我的方法:

public String 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;
         }
    }

我希望这可以帮助某人。编码愉快!


0
投票

对于可能要使用此方法的用户,请将getCommalessNumber(String commaNumber)方法的返回类型更改为String而不是int。

© www.soinside.com 2019 - 2024. All rights reserved.