0
votes

Entrée décimale Editext en Java

Je veux avoir un texte d'édition avec une certaine valeur comme 0,00 et le curseur doit être sur le côté gauche. Lorsque l'utilisateur appuyez sur 1, il devrait être 1,00, lorsque l'utilisateur appuie sur 2, il devrait être 12.00, lorsque l'utilisateur appuyez sur "". le curseur doit se déplacer de l'autre côté de la décimale. Après avoir déplacé à l'autre côté de la décimale lorsque l'utilisateur appuyez sur 3, il devrait être de 12,30 et sur une pression sur 4, il devrait être 12,34. De même sur le dos, il devrait être de 12,30 -> 12,00 -> 1,00 -> 0,00. échantillon xxx


4 commentaires

Ce code fonctionne comme vous voulez. Quelle est la difficulté à laquelle vous êtes confronté?


Ce n'est pas une bonne solution. Il est à la traîne pendant l'écriture. Miss beaucoup de chiffres, l'expérience utilisateur est très mauvaise


@MD Avez-vous essayé ce code?


Y a-t-il quelqu'un qui a trouvé une réponse optimisée?


4 Réponses :


0
votes

Vous pouvez utiliser string.format ("%. 2f", d) code> à l'intérieur de votre OntextChanged code> pour formater

update 1: strong> P>

class DecimalDigitsInputFilter implements InputFilter {
   private Pattern mPattern;
   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) {
      Matcher matcher = mPattern.matcher(dest);
      if (!matcher.matches())
      return "";
      return null;
   }
}


3 commentaires

J'ai essayé cela il arrondit la double valeur. Que veux-je vouloir écrire des chiffres des deux côtés du point décimal


Merci pour la réponse @niraj. Il limite uniquement les chiffres avant et après le point décimal, mais il ne gère pas les cas de backresse et de décalage sur le point décimal cliquez dessus, il limite simplement le nombre de chiffres avant et après la décimale


Je pense que mon problème ne peut être résolu que par Textwatcher. il n'y a pas d'autre solution



0
votes

Essayez d'utiliser décimalformat classe en Java. Cela peut vous aider de manière meilleure. XXX


2 commentaires

Évitez d'utiliser Textwatcher si vous utilisez décimalformat


Merci @arnab pouvez-vous s'il vous plaît envoyez-moi le code Snippet afin que je puisse essayer. J'ai essayé toutes les choses disponibles sur Internet mais incapables d'y parvenir



0
votes

XML

EditText et_des_input = (EditText) findViewById(R.id.et_des_input);
et_des_input.addTextChangedListener(new AmountTextWatcher(et_des_input, 2));


1 commentaires

Je sais que cette solution fonctionne, mais problème est que cela est à la traîne lorsque vous le testez sur Samsung S7. Il n'écris pas comme un autre EditText le fait. Y a-t-il une meilleure solution?



0
votes

J'ai fait cette solution pour deux décimales. S'il vous plaît vérifier les gars. Cela fonctionne pour deux décimales.

Classe publique TXLabzTextWatcher implémente TextWatcher { P>

EditText editText;
String tempText = "";
StringBuilder stringBuilder;
Context ctx;
boolean isBackSpacePressed = false;
int digitsAfteZero;
int count;
boolean isFirstDigitBeforeDecimalZero = true;


public TxLabzTextWatcher(Context context, EditText editText, int digitsAfterZero) {

    this.editText = editText;
    tempText = editText.getText().toString();
    stringBuilder = new StringBuilder();
    this.ctx = context;
    this.digitsAfteZero = digitsAfterZero;
    count = 0;

}

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    if (after < count) {
        isBackSpacePressed = true;
    } else {
        isBackSpacePressed = false;
    }

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    editText.removeTextChangedListener(this);

    if (stringBuilder.toString().isEmpty()) {
        stringBuilder.append("0.00");
    }

    if (!isBackSpacePressed) {
        editText.removeTextChangedListener(this);
        stringBuilder.setLength(0);
        stringBuilder.append(s);
        char ch = s.charAt(start + before);

        if (!isClickDot(ch)) {
            if (stringBuilder.length() > 0 && stringBuilder.indexOf(".") - 1 == editText.getSelectionStart() && stringBuilder.charAt(stringBuilder.indexOf(".") - 1) == '0' && ch != '0' && isFirstDigitBeforeDecimalZero) {
                stringBuilder.deleteCharAt(stringBuilder.indexOf(".") - 1);
                editText.setText(stringBuilder.toString());
                editText.setSelection(editText.getText().length() - 3);
                isFirstDigitBeforeDecimalZero = false;
            } else if (ch == '0' && stringBuilder.indexOf(".") - 1 == editText.getSelectionStart()) {
                stringBuilder.deleteCharAt(stringBuilder.indexOf(".") - 1);
                editText.setText(stringBuilder.toString());
                editText.setSelection(editText.getText().length() - 3);
                isFirstDigitBeforeDecimalZero = false;
            }
        }


        // if i press dot then move to the other side of
        if (isClickDot(ch) && StringUtils.countMatches(stringBuilder.toString(), ".") >= 1) {
            stringBuilder.deleteCharAt(s.toString().indexOf('.'));
            editText.setText(stringBuilder.toString());
            editText.setSelection(s.toString().indexOf('.') + 1);
        }

        // replace first digit after decimal
        if (stringBuilder.indexOf(".") + 2 == editText.getSelectionStart() && !isClickDot(ch)) {
            int currIndex = stringBuilder.indexOf(".") + 1;
            stringBuilder.deleteCharAt(currIndex + 1);
            editText.setText(stringBuilder.toString());
            editText.setSelection(currIndex + 1);
            count++;
        }

        // replace last digit after decimal
        if (stringBuilder.indexOf(".") + 3 == editText.getSelectionStart() && !isClickDot(ch)) {
            int currIndex = stringBuilder.indexOf(".") + 2;
            stringBuilder.deleteCharAt(currIndex + 1);
            editText.setText(stringBuilder.toString());
            editText.setSelection(currIndex + 1);
            count++;
        }

        // if string builder after decimal have more than 2 length then delete it
        if (editText.getSelectionEnd() == stringBuilder.length() && stringBuilder.subSequence(stringBuilder.indexOf(".") + 1, stringBuilder.length()).length() > digitsAfteZero) {
            stringBuilder.deleteCharAt(editText.getSelectionEnd() - 1);
            editText.setText(stringBuilder.toString());
            editText.setSelection(stringBuilder.length());
        }


        editText.addTextChangedListener(this);
    } else {
        editText.removeTextChangedListener(this);

        if (s.toString().length() == 3 && s.toString().contains(".") && s.toString().substring(0, s.toString().indexOf('.')).length() == 0) {
            // place zero befor decimal
            String zeroBeforeDecimal = "0" + s.toString();
            stringBuilder.setLength(0);
            stringBuilder.append(zeroBeforeDecimal);
            editText.setText(stringBuilder.toString());
            isFirstDigitBeforeDecimalZero = true;
        }

        // if cursor is moved to other side of decimal now move it to left side of decimal
        if (stringBuilder.toString().contains(".") && editText.getSelectionStart() == stringBuilder.indexOf(".")) {
            stringBuilder.setLength(0);
            stringBuilder.append(s);
            stringBuilder.insert(stringBuilder.length() - 2, ".");
            editText.setText(stringBuilder.toString());
            editText.setSelection(stringBuilder.indexOf("."));
        }

        // if cursor is after one digit after decimal
        if (stringBuilder.indexOf(".") + 1 == editText.getSelectionStart()) {
            int currIndex = stringBuilder.indexOf(".") + 1;
            stringBuilder.deleteCharAt(currIndex);
            stringBuilder.insert(currIndex, "0");
            editText.setText(stringBuilder.toString());
            editText.setSelection(currIndex - 1);
        }

        // if cursor is on last digit then replace it with zero
        if (stringBuilder.indexOf(".") + 2 == editText.getSelectionStart()) {
            int currIndex = stringBuilder.indexOf(".") + 2;
            stringBuilder.deleteCharAt(currIndex);
            stringBuilder.insert(currIndex, "0");
            editText.setText(stringBuilder.toString());
            editText.setSelection(currIndex);
        }

        editText.addTextChangedListener(this);
    }
}

@Override
public void afterTextChanged(Editable arg0) {
}

boolean isClickDot(char dot) {
    if (dot == '.')
        return true;
    return false;
}


0 commentaires