Как сделать так, чтобы форматированный EditText начинался справа налево с помощью TextWatcher?

#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) {


                }
            });