Как разделить запятыми числа в EditText - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть EditText, который имеет тип ввода число .Пока пользователь печатает, я хочу разделить их запятыми.Вот небольшая иллюстрация:

123 будет представлено как 123

1234 будет представлено как 1234

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 не работает таким образом, потому что мое приложение зависает (а затем падает гораздо позже), когда я делаю это.

Есть ли лучший способ добиться этого?Спасибо в ожидании положительного ответа.

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Попробуйте этот код:

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

            }
        });

Посмотреть это сообщение

0 голосов
/ 18 февраля 2019

Я получил два хороших ответа, но я просто хотел добавить это:

Причина, по которой я столкнулся с этой проблемой, заключалась в том, что editText.setText(...) вызывался рекурсивно внутри afterTextChanged() функция моего TextWatcher.Как справедливо заявили предыдущие авторы, решение состоит в том, чтобы временно остановить метод 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;
         }
    }

Я надеюсь, что это поможет кому-то там.Веселое кодирование !!

0 голосов
/ 17 февраля 2019

Попробуйте использовать String.format вместо того, что у вас есть сейчас.

Замените это:

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

на это:

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

Другое дело - ваше приложение может получить этот сбой, потому что каждый раз, когда вы вызываете setText() внутри afterTextChanged, вызывается другой afterTextChanged, который в основном создает бесконечный цикл.Если это ваша проблема, вы можете найти хорошее решение здесь .

...