Принудительно завершающие нули в EditText Android - PullRequest
0 голосов
/ 28 февраля 2020

Я скопировал код из stackoverflow, используя InputFilter, чтобы заставить текст редактирования иметь 3 цифры перед "." и 2 цифры после (2 десятичных знака). Тем не менее, я хочу, чтобы система отображала 15,00, если пользователь вводит только 15?

Итак, сценарий, который я хочу, состоит в том, чтобы ... редактировать текст должен иметь не более 2 десятичных знаков, например 12,56, но если пользователь вводит только 15, редактируйте текстовое поле. добавляет 2 нуля в конце, так что 15 -> 15.00

Как мне это сделать в addTextChangedListener?

Код из stackoverflow относительно inputfilter

public class DecimalDigitsInputFilter implements InputFilter {

Pattern mPattern;

public DecimalDigitsInputFilter(int digitsBeforeZero,int digitsAfterZero) {
    mPattern=Pattern.compile("[0-9]{0," + (digitsBeforeZero-1) + "}+((\\.[0-9]{0," + (digitsAfterZero-1) + "})?)||(\\.)?");
}

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

    String s = Html.toHtml(dest).replaceAll("\\<.*?>","").replaceAll("\n","");
    Matcher matcher = mPattern.matcher(dest);
    if (!matcher.matches())
        return "";
    try {
        if(Double.parseDouble(s)<9999.99 && s.contains(".")) {
            return null;
        }else if ((Double.parseDouble(s)<1000 && !s.contains("."))||source.equals(".")) {
            return null;
        }else {
            return "";
        }
    }catch (Exception e) {
        e.printStackTrace();
    }
    return null;
  }
}
    /// in main activity
   numberReceivedEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter(3, 2)}); 
   numberReceivedEditText.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) {
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

1 Ответ

0 голосов
/ 28 февраля 2020

Пожалуйста, попробуйте это

numberReceivedEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter(numberReceivedEditText)});

numberReceivedEditText.addTextChangedListener(new TextWatcher() {

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            if (i2 == 0) return;
            int cursorLocation = numberReceivedEditText.getSelectionStart();
            String data = numberReceivedEditText.getText().toString();
            if (!data.isEmpty()) {
                if (!data.contains(".")) {
                    data = data + ".";
                }

                try {
                    data = String.format(Locale.JAPANESE, "%.2f", Double.parseDouble(data));
                    numberReceivedEditText.removeTextChangedListener(this);
                    numberReceivedEditText.setText(data);
                    numberReceivedEditText.setSelection(cursorLocation < data.length() ? cursorLocation : cursorLocation - 1, cursorLocation);
                    numberReceivedEditText.addTextChangedListener(this);
                }catch (Exception e){
                    e.printStackTrace();
                }

            }
        }

        @Override
        public void afterTextChanged(Editable editable) {
        }
    });

class DecimalDigitsInputFilter implements InputFilter {

TextView tvNumber;

public DecimalDigitsInputFilter(TextView tvNumber) {
    this.tvNumber = tvNumber;
}

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

    try {
        if (Double.parseDouble(tvNumber.getText().toString()) > 1000) {
            String[] splitValue = tvNumber.getText().toString().split("\\.");
            return splitValue[0].substring(0,3) + "." + splitValue[1];
        }
    } catch (Exception e) {
        return source;
    }
    return null;
}

}

...