EditText с форматом валюты

У меня есть EditText, в котором я хочу отображать валюту:

    input.setInputType(InputType.TYPE_CLASS_NUMBER);
    input.addTextChangedListener(new CurrencyTextWatcher());

с:

public class CurrencyTextWatcher implements TextWatcher {

boolean mEditing;

public CurrencyTextWatcher() {
    mEditing = false;
}

public synchronized void afterTextChanged(Editable s) {
    if(!mEditing) {
        mEditing = true;

        String digits = s.toString().replaceAll("\\D", "");
        NumberFormat nf = NumberFormat.getCurrencyInstance();

        try{
            String formatted = nf.format(Double.parseDouble(digits)/100);
            s.replace(0, s.length(), formatted);
        } catch (NumberFormatException nfe) {
            s.clear();
        }

        mEditing = false;
    }
}

Я хочу, чтобы пользователь мог видеть только номерную клавиатуру, поэтому я называю

input.setInputType(InputType.TYPE_CLASS_NUMBER);

в моем EditText. Однако это не работает. Я вижу цифры как введенные без форматирования. НО: Если я НЕ устанавливаю inputType через input.setInputType(InputType.TYPE_CLASS_NUMBER), форматирование работает отлично. Но пользователь должен использовать обычную клавиатуру, что не очень приятно. Как я могу использовать цифровую клавиатуру, а также видеть правильное форматирование валюты в моем EditText? Спасибо.

Ответ 1

Лучше использовать интерфейс InputFilter. Гораздо проще обрабатывать любые входы с помощью регулярного выражения. Мое решение для формата ввода валюты:

public class CurrencyFormatInputFilter implements InputFilter {

Pattern mPattern = Pattern.compile("(0|[1-9]+[0-9]*)?(\\.[0-9]{0,2})?");

@Override
public CharSequence filter(
        CharSequence source,
        int start,
        int end,
        Spanned dest,
        int dstart,
        int dend) {

    String result = 
            dest.subSequence(0, dstart)
            + source.toString() 
            + dest.subSequence(dend, dest.length());

    Matcher matcher = mPattern.matcher(result);

    if (!matcher.matches()) return dest.subSequence(dstart, dend);

    return null;
}
}

Действует: 0.00, 0.0, 10.00, 111.1
Недопустимо: 0, 0.000, 111, 10, 010.00, 01.0

Как использовать:

editText.setFilters(new InputFilter[] {new CurrencyFormatInputFilter()});

Ответ 2

Попробуйте добавить это свойство в ваше объявление xml для редактирования текста:

android:inputType="numberDecimal" или номер или подписанный номер

Подробнее о android:inputType здесь.