s.replace() не работает в Android EditText в TextWatcher

У меня есть EditText, в котором пользователь должен ввести число, включая десятичные знаки, и я хочу, чтобы к входному числу автоматически добавлялся разделитель тысяч. Я пробовал несколько других методов, но некоторые не позволяют использовать числа с плавающей запятой, поэтому я придумал этот код, который работает хорошо, только то, что ввод строки не редактируется в реальном времени до единицы с возможными тысячами разделителей, и ошибки, похоже, связаны с s.replace();

am2 = new TextWatcher(){
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }
    public void onTextChanged(CharSequence s, int start, int before, int count) {}
    public void afterTextChanged(Editable s) {
        if (s.toString().equals("")) {
            amount.setText("");
            value = 0;
        }else{
            StringBuffer strBuff = new StringBuffer();
            char c;
            for (int i = 0; i < amount2.getText().toString().length() ; i++) {
                c = amount2.getText().toString().charAt(i);
                if (Character.isDigit(c)) {
                    strBuff.append(c);
                }
            }
            value = Double.parseDouble(strBuff.toString());
            reverse();
            NumberFormat nf2 = NumberFormat.getInstance(Locale.ENGLISH);
            ((DecimalFormat)nf2).applyPattern("###,###.#######");
            s.replace(0, s.length(), nf2.format(value));
        }
    }
};

person Asiimwe    schedule 18.09.2012    source источник


Ответы (2)


Я думаю, вы должны использовать setText() текста редактирования после изменения текста, сделайте что-то вроде этого editext.setText(s); после замены строки

person Hardik4560    schedule 18.09.2012
comment
да, потому что... это будет продолжаться непрерывно, так как установка текста в onTextChanged снова вызовет его.... и то же самое, что вызовет зацикливание... применение некоторого механизма блокировки.... - person Hardik4560; 19.09.2012

простая s = s.replace(0, s.length(), nf2.format(value)); То есть переменная s должна быть назначена.

person Abin    schedule 24.01.2014