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
здесь.