#java #android #android-edittext #android-textwatcher
#java #Android #android-edittext #android-textwatcher
Вопрос:
Что у меня есть:
У меня есть EditText, который принимает десятичный ввод, и я установил значение по умолчанию в XML равным 0.00
(если ввода еще нет)
Если пользователь нажимает 1
, значение меняется на 1
. Если ему нужно ввести десятичное значение, он должен нажать точку .
на клавиатуре.
Чего я хочу:
Я хочу автоматически отформатировать EditText в десятичном формате 0.00
, поэтому, если пользователь нажимает 1
if, он становится 0.01
вместо 1
(как в приложении PAYPAL). Если он ввел 100
, то значение в EditText должно быть отформатировано как 1.00
.
Я знаю, что это можно сделать с помощью TextWatcher
, но я не знаю, как этого добиться.
Сравнение конечного результата:
ЧТО У МЕНЯ ЕСТЬ
1 = 1
11 = 11
222 = 222
ЧТО МНЕ НУЖНО
1 = 0.01
11 = 0.11
222 = 2.22
Обновить:
Мой фактический TextWatcher выглядит так, как показано ниже, просто чтобы установить значение по умолчанию 0.00
, если пользователь удалит все входные данные (для предотвращения ошибок при вычислении функций).
private class EditTextListener implements TextWatcher {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (editText.getText().toString().equals("") || editText.length() < 1){
editText.setText("0.00");
editText.post(() -> editText.setSelection(editText.getText().length()));
} else {
BigDecimal amount = new BigDecimal(editText.getText().toString());
}
}
}
Комментарии:
1. Опубликуйте какой-нибудь код, показывающий, что вы сделали
Ответ №1:
как вы описали, вам нужно разделить его на 100 с десятичными точками:
@Override
public void afterTextChanged(Editable s) {
if (editText.getText().toString().equals("") || editText.length() < 1) {
editText.setText("0.00");
editText.post(() -> editText.setSelection(editText.getText().length()));
} else {
double amount = Double.parseDouble(editText.getText().toString());
editText.setText(String.format("%.2f", (amount / 100.0));
}
}
Комментарии:
1. Он преобразуется так, как я хотел, но не может быть возвращен в качестве значения для EditText. В этом примере я получаю a
NumberFormatException for input String
, когда вывод равен (0,05), если пользователь нажал 5. Если я конвертирую в языковой стандарт. РУССКИЙ Я получаю вывод (0.05), но приложение входит в бесконечный цикл с огромным потреблением памяти, после чего оно закрывается.
Ответ №2:
Попробуйте использовать этот код
edtQtdVolume.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
edtQtdVolume.removeTextChangedListener(this);
String cleanString = s.toString().replaceAll("[R$,.]", "");
double parsed = Double.parseDouble(cleanString);
Locale locale = new Locale("en", "US");
NumberFormat nf = NumberFormat.getNumberInstance(locale);
DecimalFormat formatter = (DecimalFormat) nf;
formatter.applyPattern("#0.00");
String formatted = formatter.format((parsed/100));
edtQtdVolume.setText(formatted);
edtQtdVolume.setSelection(formatted.length());
edtQtdVolume.addTextChangedListener(this);
lista.get(position).setQtdVolumeInformadoColeta(Double.valueOf(formatted));
}
@Override
public void afterTextChanged(Editable s) {
}
});