Begrenzen Sie Dezimalstellen in Android EditText

125

Ich versuche eine App zu schreiben, mit der Sie Ihre Finanzen verwalten können. Ich verwende ein EditTextFeld, in dem der Benutzer einen Geldbetrag angeben kann.

Ich habe festgelegt, inputTypeauf numberDecimalwelche Weise gut funktioniert, außer dass die Leute dadurch Zahlen eingeben können, 123.122die nicht perfekt für Geld sind.

Gibt es eine Möglichkeit, die Anzahl der Zeichen nach dem Dezimalpunkt auf zwei zu beschränken?

Konstantin Weitz
quelle
Sie können einen regulären Ausdruck schreiben und den Inhalt des Bearbeitungstextes überprüfen, wenn er den Fokus verliert.
Blindstuff
Ich habe die InputFilterSchnittstelle gefunden, sie scheint zu tun, was ich will. Developer.android.com/reference/android/text/method/… , aber die Methode filter, die ich implementieren muss, ist für mich ziemlich verwirrend. Hat jemand schon einen solchen Filter geschrieben und weiß, wie man ihn benutzt?
Konstantin Weitz
Funktioniert eine der vorgeschlagenen Lösungen für RTL-Gebietsschemas? Soweit ich das beurteilen kann, werden sie nicht ...
Nick

Antworten:

118

Ein eleganterer Weg wäre die Verwendung eines regulären Ausdrucks (Regex) wie folgt:

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

        Matcher matcher=mPattern.matcher(dest);       
        if(!matcher.matches())
            return "";
        return null;
    }

}

Um es zu benutzen, tun Sie:

editText.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(5,2)});
Asaf Pinhassi
quelle
32
Hallo, es gibt einige Randfälle, die immer noch nicht gut behandelt werden. Zum Beispiel neige ich nach der Eingabe von 2.45 dazu, "den Cursor an die vorderste Stelle des Textes zu bewegen". Ich möchte Text 12.45 produzieren, das wird nicht erlaubt.
Cheok Yan Cheng
3
Es ist nicht möglich, Ziffern vor der Dezimalstelle zu ändern, nachdem der Benutzer 2 Ziffern nach dem Dezimalpunkt eingegeben hat.
Gaurav Singla
9
Tolle Lösung, aber nicht ganz richtig. Der Matcher sollte dest nicht überprüfen, er sollte den Wert im edittext (destSequence (0, dstart) + sourceSequence (start, end) + destSequence (dend, dest.length ())
Mihaela Romanca
7
Mihaela hat recht, wir sollten mit der Zeichenfolge übereinstimmen, die versucht, den Edittext zu füllen. Ich habe herausgefunden, wie eine andere Frage wie diese verkettet werden kann. Die Regex verursachte danach jedoch Probleme, also änderte ich sie in "^ \\ d {1," + digitsBeforeZero + "} (\\. \\ d {0," + digitsAfterZero + "})? $" Aber Sie ' Ich muss auch danach eine Validierung durchführen, weil "1." ist mit diesem regulären Ausdruck gültig, aber wir brauchen ihn so, damit der Punkt eingegeben werden kann.
dt0
6
Wie würden Sie diese Arbeit auch für Kommas (,) machen? Einige Regionen der Welt geben Dezimalzahlen mit Kommas ein (Beispiel: 123,45).
Andrew
65

Einfachere Lösung ohne Verwendung von Regex:

import android.text.InputFilter;
import android.text.Spanned;

/**
 * Input filter that limits the number of decimal digits that are allowed to be
 * entered.
 */
public class DecimalDigitsInputFilter implements InputFilter {

  private final int decimalDigits;

  /**
   * Constructor.
   * 
   * @param decimalDigits maximum decimal digits
   */
  public DecimalDigitsInputFilter(int decimalDigits) {
    this.decimalDigits = decimalDigits;
  }

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


    int dotPos = -1;
    int len = dest.length();
    for (int i = 0; i < len; i++) {
      char c = dest.charAt(i);
      if (c == '.' || c == ',') {
        dotPos = i;
        break;
      }
    }
    if (dotPos >= 0) {

      // protects against many dots
      if (source.equals(".") || source.equals(","))
      {
          return "";
      }
      // if the text is entered before the dot
      if (dend <= dotPos) {
        return null;
      }
      if (len - dotPos > decimalDigits) {
        return "";
      }
    }

    return null;
  }

}

Benutzen:

editText.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(2)});
Peceps
quelle
Was würde mich davon abhalten, nicht numerische Zeichen wie 'a' in die Zeichenfolge einzufügen?
Konstantin Weitz
4
Dies: <EditText ... android: inputType = "number" />
Peceps
1
Das sollte sein: editText.setFilters (neuer InputFilter [] {neuer DecimalDigitsInputFilter (2)});
Frak
6
Dies behandelt nicht den Fall, in dem ich "999" eingebe und dann nach dem ersten 9 einen Dezimalpunkt
einfüge
1
Danke das nützlich. Mit diesem Längenfilter können wir auch Ziffern vor dem Dezimalpunkt einschränken. Kotlin: edtAnyAmount.filters = arrayOf <InputFilter> (InputFilter.LengthFilter (7), DecimalDigitsInputFilter (2))
Faldu Jaldeep
37

Diese Implementierung von InputFilterlöst das Problem.

import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.method.DigitsKeyListener;

public class MoneyValueFilter extends DigitsKeyListener {
    public MoneyValueFilter() {
        super(false, true);
    }

    private int digits = 2;

    public void setDigits(int d) {
        digits = d;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end,
            Spanned dest, int dstart, int dend) {
        CharSequence out = super.filter(source, start, end, dest, dstart, dend);

        // if changed, replace the source
        if (out != null) {
            source = out;
            start = 0;
            end = out.length();
        }

        int len = end - start;

        // if deleting, source is empty
        // and deleting can't break anything
        if (len == 0) {
            return source;
        }

        int dlen = dest.length();

        // Find the position of the decimal .
        for (int i = 0; i < dstart; i++) {
            if (dest.charAt(i) == '.') {
                // being here means, that a number has
                // been inserted after the dot
                // check if the amount of digits is right
                return (dlen-(i+1) + len > digits) ? 
                    "" :
                    new SpannableStringBuilder(source, start, end);
            }
        }

        for (int i = start; i < end; ++i) {
            if (source.charAt(i) == '.') {
                // being here means, dot has been inserted
                // check if the amount of digits is right
                if ((dlen-dend) + (end-(i + 1)) > digits)
                    return "";
                else
                    break;  // return new SpannableStringBuilder(source, start, end);
            }
        }

        // if the dot is after the inserted part,
        // nothing can break
        return new SpannableStringBuilder(source, start, end);
    }
}
Konstantin Weitz
quelle
Darf ich wissen, dass es einen Grund gibt, SpannableStringBuilder anstelle von null zurückzugeben? Ich teste es mit null, es funktioniert auch gut. Müssen wir auch von DigitsKeyListener erben? Bei Verwendung von Android: inputType = "numberDecimal" führt alle "0123456789" aus. Durchsetzung von Zeichen.
Cheok Yan Cheng
1
Funktioniert gut. Vielen Dank.
Andrei Aulaska
34

Hier ist ein Beispiel für einen InputFilter, der nur maximal 4 Stellen vor dem Dezimalpunkt und maximal 1 Stelle danach zulässt.

Werte, die edittext zulässt: 555.2 , 555 , .2

Von edittext blockierte Werte: 55555.2 , 055.2 , 555.42

        InputFilter filter = new InputFilter() {
        final int maxDigitsBeforeDecimalPoint=4;
        final int maxDigitsAfterDecimalPoint=1;

        @Override
        public CharSequence filter(CharSequence source, int start, int end,
                Spanned dest, int dstart, int dend) {
                StringBuilder builder = new StringBuilder(dest);
                builder.replace(dstart, dend, source
                        .subSequence(start, end).toString());
                if (!builder.toString().matches(
                        "(([1-9]{1})([0-9]{0,"+(maxDigitsBeforeDecimalPoint-1)+"})?)?(\\.[0-9]{0,"+maxDigitsAfterDecimalPoint+"})?"

                        )) {
                    if(source.length()==0)
                        return dest.subSequence(dstart, dend);
                    return "";
                }

            return null;

        }
    };

    mEdittext.setFilters(new InputFilter[] { filter });
Favas Kv
quelle
lässt nicht. zu tippen
AmiNadimi
22

Ich habe einige Korrekturen für die @ Pinhassi-Lösung vorgenommen. Es behandelt einige Fälle:

1. Sie können den Cursor überall hin bewegen

2. Minuszeichenbehandlung

3. Ziffern vor = 2 und Ziffern nach = 4 und Sie geben 12.4545 ein. Wenn Sie dann "." Entfernen möchten, wird dies nicht zugelassen.

public class DecimalDigitsInputFilter implements InputFilter {
    private int mDigitsBeforeZero;
    private int mDigitsAfterZero;
    private Pattern mPattern;

    private static final int DIGITS_BEFORE_ZERO_DEFAULT = 100;
    private static final int DIGITS_AFTER_ZERO_DEFAULT = 100;

    public DecimalDigitsInputFilter(Integer digitsBeforeZero, Integer digitsAfterZero) {
    this.mDigitsBeforeZero = (digitsBeforeZero != null ? digitsBeforeZero : DIGITS_BEFORE_ZERO_DEFAULT);
    this.mDigitsAfterZero = (digitsAfterZero != null ? digitsAfterZero : DIGITS_AFTER_ZERO_DEFAULT);
    mPattern = Pattern.compile("-?[0-9]{0," + (mDigitsBeforeZero) + "}+((\\.[0-9]{0," + (mDigitsAfterZero)
        + "})?)||(\\.)?");
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    String replacement = source.subSequence(start, end).toString();
    String newVal = dest.subSequence(0, dstart).toString() + replacement
        + dest.subSequence(dend, dest.length()).toString();
    Matcher matcher = mPattern.matcher(newVal);
    if (matcher.matches())
        return null;

    if (TextUtils.isEmpty(source))
        return dest.subSequence(dstart, dend);
    else
        return "";
    }
}
android_dev
quelle
Ich denke, es sollte die perfekte Lösung sein, machte meinen Tag. Danke dir.
Pratik Butani
1
@ Omkar das ist falsch. Diese Bedingung ist immer wahr, auch wenn Länge> 0, dest.length () == 0 immer wahr, auch wenn Sie den gesamten Text mehr als 0
bearbeiten
@ Omkar entfernen Sie Ihren Kommentar pls
user924
@android_dev warum kann ich keine negativen Werte (Minus) eingeben?
user924
WENN Sie festlegen android:inputType="number"oder android:inputType="numberDecimal"es nicht erlaubt, Minus android:digits="0123456789.-"
einzugeben
18

Ich mag die andere Lösung nicht und habe meine eigene erstellt. Mit dieser Lösung können Sie nicht mehr als die MAX_BEFORE_POINT-Ziffer vor dem Punkt eingeben und die Dezimalstellen dürfen nicht mehr als MAX_DECIMAL sein.

Sie können die Ziffer einfach nicht übermäßig eingeben, keine anderen Effekte! Zusätzlich, wenn Sie "." es gibt "0" ein

  1. Stellen Sie den EditText im Layout auf:

    android: inputType = "numberDecimal"

  2. Fügen Sie den Listener zu Ihrem onCreate hinzu. Wenn Sie die Anzahl der Stellen vor und nach dem Punkt ändern möchten, bearbeiten Sie den Aufruf von PerfectDecimal (str, NUMBER_BEFORE_POINT, NUMBER_DECIMALS). Hier wird 3 und 2 festgelegt

    EditText targetEditText = (EditText)findViewById(R.id.targetEditTextLayoutId);
    
    targetEditText.addTextChangedListener(new TextWatcher() {
      public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}
    
      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}
    
      public void afterTextChanged(Editable arg0) {
        String str = targetEditText.getText().toString();
        if (str.isEmpty()) return;
        String str2 = PerfectDecimal(str, 3, 2);
    
        if (!str2.equals(str)) {
            targetEditText.setText(str2);
            int pos = targetEditText.getText().length();
            targetEditText.setSelection(pos);
        }
      }
    });
  3. Schließen Sie diese Funktion ein:

    public String PerfectDecimal(String str, int MAX_BEFORE_POINT, int MAX_DECIMAL){
      if(str.charAt(0) == '.') str = "0"+str;
      int max = str.length();
    
      String rFinal = "";
      boolean after = false;
      int i = 0, up = 0, decimal = 0; char t;
      while(i < max){
        t = str.charAt(i);
        if(t != '.' && after == false){
            up++;
            if(up > MAX_BEFORE_POINT) return rFinal;
        }else if(t == '.'){
            after = true;
        }else{
            decimal++;
            if(decimal > MAX_DECIMAL)
                return rFinal;
        }
        rFinal = rFinal + t;
        i++;
      }return rFinal;
    }

Und es ist geschafft!

Apoleo
quelle
1
Prost. Arbeite sehr gut, wenn der andere nicht für mich funktioniert hat
Bär
1
Dies sollte die akzeptierte Antwort sein. Es ist perfekt. Alle Bedingungen sind hier erfüllt.
Nayan
1
Bei all den hoch bewerteten Antworten hat diese Antwort tatsächlich für mich funktioniert.
Rohit Mandiwal
Gut gemacht! Ich habe alle Kombinationen ausprobiert und es scheint, dass es großartig funktioniert. Danke dir.
Akelec
Ich weiß nicht, wie es funktioniert, aber es funktioniert einfach wie ein Zauber.
wonsuc
17

Ich habe dies mit Hilfe von TextWatcherauf folgende Weise erreicht

final EditText et = (EditText) findViewById(R.id.EditText1);
int count = -1;
et.addTextChangedListener(new TextWatcher() {
    public void onTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) {             

    }
    public void beforeTextChanged(CharSequence arg0, int arg1,int arg2, int arg3) {             

    }

    public void afterTextChanged(Editable arg0) {
        if (arg0.length() > 0) {
            String str = et.getText().toString();
            et.setOnKeyListener(new OnKeyListener() {
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    if (keyCode == KeyEvent.KEYCODE_DEL) {
                        count--;
                        InputFilter[] fArray = new InputFilter[1];
                        fArray[0] = new InputFilter.LengthFilter(100);
                        et.setFilters(fArray);
                        //change the edittext's maximum length to 100. 
                        //If we didn't change this the edittext's maximum length will
                        //be number of digits we previously entered.
                    }
                    return false;
                }
            });
            char t = str.charAt(arg0.length() - 1);
            if (t == '.') {
                count = 0;
            }
            if (count >= 0) {
                if (count == 2) {                        
                    InputFilter[] fArray = new InputFilter[1];
                    fArray[0] = new InputFilter.LengthFilter(arg0.length());
                    et.setFilters(fArray);
                    //prevent the edittext from accessing digits 
                    //by setting maximum length as total number of digits we typed till now.
                }
                count++;
            }
        }
    }
});

Bei dieser Lösung kann der Benutzer nicht mehr als zwei Nachkommastellen eingeben. Sie können auch eine beliebige Anzahl von Stellen vor dem Dezimalpunkt eingeben. In diesem Blog http://v4all123.blogspot.com/2013/05/set-limit-for-fraction-in-decimal.html können Sie den Filter für mehrere EditText festlegen. Ich hoffe das wird helfen. Danke dir.

Gunaseelan
quelle
Entschuldigung für die späten Infos. Vergessen Sie nicht, countmit zu initialisieren -1. Dann funktioniert nur das richtig. int count = -1;
Gunaseelan
Gunaseelan - ich habe den obigen Code ausprobiert und er funktioniert gut. Aber wenn ich den eingegebenen Text lösche und wieder anfange, nur eine Ziffer einzugeben, gibt es eine Lösung dafür .....
Siva K
@SivaK Auf keinen Fall Freund. Wenn Sie löschen und dann eingeben, werden mindestens 100 Ziffern akzeptiert. Ich weiß nicht, wie Sie darauf zugreifen listener. Wie auch immer, schauen Sie sich bitte meinen Blog- Beitrag an . Sie können eine Idee bekommen. Wenn Sie nicht können, lassen Sie es mich bitte wissen. Ich werde Ihnen in Bezug auf dieses Problem helfen.
Gunaseelan
Ich habe überprüft, was @SivaK gesagt hat. Das ist auf jeden Fall klug, aber ich werde einige Änderungen daran vornehmen, damit es (meiner Meinung nach) voll funktionsfähig ist
MrTristan
@ Gunaseelan danke für deine Lösung. Aber es hat einige Fehler. Wenn ich beispielsweise die zweite Dezimalstelle lösche, ist es unmöglich, sie erneut einzugeben (ich muss alle Dezimalstellen löschen, um sie erneut eingeben zu können). Nach dem Löschen des gesamten Eintrags treten beim erneuten Eingeben einige seltsame Einschränkungen auf.
Akelec
14

Mit dem von mir entwickelten InputFilter können Sie die Anzahl der Stellen vor und nach der Dezimalstelle konfigurieren. Außerdem werden führende Nullen nicht zugelassen.

public class DecimalDigitsInputFilter implements InputFilter
{
    Pattern pattern;

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

    @Override public CharSequence filter(CharSequence source, int sourceStart, int sourceEnd, Spanned destination, int destinationStart, int destinationEnd)
    {
        // Remove the string out of destination that is to be replaced.
        String newString = destination.toString().substring(0, destinationStart) + destination.toString().substring(destinationEnd, destination.toString().length());

        // Add the new string in.
        newString = newString.substring(0, destinationStart) + source.toString() + newString.substring(destinationStart, newString.length());

        // Now check if the new string is valid.
        Matcher matcher = pattern.matcher(newString);

        if(matcher.matches())
        {
            // Returning null indicates that the input is valid.
            return null;
        }

        // Returning the empty string indicates the input is invalid.
        return "";
    }
}

// To use this InputFilter, attach it to your EditText like so:
final EditText editText = (EditText) findViewById(R.id.editText);

EditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter(4, 4)});
Luke
quelle
Schöne Lösung! Es funktioniert für mich, aber ich möchte die führende Periode (Punkt) nicht zulassen. Zum Beispiel ist ".123" keine zulässige Sequenz. Wie erreicht man das?
Ibogolyubskiy
13

Die Anforderung ist 2 Nachkommastellen. Es sollte keine Begrenzung für Ziffern vor dem Dezimalpunkt geben. Die Lösung sollte also sein:

public class DecimalDigitsInputFilter implements InputFilter {

    Pattern mPattern;

    public DecimalDigitsInputFilter() {
        mPattern = Pattern.compile("[0-9]*+((\\.[0-9]?)?)||(\\.)?");
    }

    @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;
    }
}

Und benutze es als,

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

Vielen Dank an @Pinhassi für die Inspiration.

Mangesh
quelle
Gut ... funktioniert gut
Jojo
12

Meine Lösung ist einfach und funktioniert perfekt!

public class DecimalInputTextWatcher implements TextWatcher {

private String mPreviousValue;
private int mCursorPosition;
private boolean mRestoringPreviousValueFlag;
private int mDigitsAfterZero;
private EditText mEditText;

public DecimalInputTextWatcher(EditText editText, int digitsAfterZero) {
    mDigitsAfterZero = digitsAfterZero;
    mEditText = editText;
    mPreviousValue = "";
    mRestoringPreviousValueFlag = false;
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    if (!mRestoringPreviousValueFlag) {
        mPreviousValue = s.toString();
        mCursorPosition = mEditText.getSelectionStart();
    }
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}

@Override
public void afterTextChanged(Editable s) {
    if (!mRestoringPreviousValueFlag) {

        if (!isValid(s.toString())) {
            mRestoringPreviousValueFlag = true;
            restorePreviousValue();
        }

    } else {
        mRestoringPreviousValueFlag = false;
    }
}

private void restorePreviousValue() {
    mEditText.setText(mPreviousValue);
    mEditText.setSelection(mCursorPosition);
}

private boolean isValid(String s) {
    Pattern patternWithDot = Pattern.compile("[0-9]*((\\.[0-9]{0," + mDigitsAfterZero + "})?)||(\\.)?");
    Pattern patternWithComma = Pattern.compile("[0-9]*((,[0-9]{0," + mDigitsAfterZero + "})?)||(,)?");

    Matcher matcherDot = patternWithDot.matcher(s);
    Matcher matcherComa = patternWithComma.matcher(s);

    return matcherDot.matches() || matcherComa.matches();
}
}

Verwendung:

myTextEdit.addTextChangedListener(new DecimalInputTextWatcher(myTextEdit, 2));
Dominik Suszczewicz
quelle
Verschieben Sie Muster von isValid()zu Konstruktor, um zu vermeiden, dass Muster bei jedem isValid()Aufruf neu erstellt werden.
Hemant Kaushik
6

Versuchen Sie es mit NumberFormat.getCurrencyInstance () um Ihre Zeichenfolge zu formatieren, bevor Sie sie in eine Textansicht einfügen.

Etwas wie:

NumberFormat currency = NumberFormat.getCurrencyInstance();
myTextView.setText(currency.format(dollars));

Bearbeiten - Es gibt keinen Eingabetyp für die Währung, den ich in den Dokumenten finden konnte. Ich stelle mir das vor, weil es einige Währungen gibt, die nicht der gleichen Regel für Dezimalstellen folgen, wie zum Beispiel den japanischen Yen.

Wie von LeffelMania erwähnt, können Sie Benutzereingaben korrigieren, indem Sie den obigen Code mit einem TextWatcherauf Ihrem Code festgelegten Code verwenden EditText.

Matthew Willis
quelle
6

Leicht verbesserte @ Pinhassi-Lösung.

Funktioniert sehr gut. Es validiert verkettete Zeichenfolgen.

public class DecimalDigitsInputFilter implements InputFilter {

Pattern mPattern;

public DecimalDigitsInputFilter() {
    mPattern = Pattern.compile("([1-9]{1}[0-9]{0,2}([0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)");

}

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

    String formatedSource = source.subSequence(start, end).toString();

    String destPrefix = dest.subSequence(0, dstart).toString();

    String destSuffix = dest.subSequence(dend, dest.length()).toString();

    String result = destPrefix + formatedSource + destSuffix;

    result = result.replace(",", ".");

    Matcher matcher = mPattern.matcher(result);

    if (matcher.matches()) {
        return null;
    }

    return "";
}

 }
Pixel
quelle
6

Ich habe die oben genannten Lösungen geändert und folgende erstellt. Sie können die Anzahl der Stellen vor und nach dem Dezimalpunkt festlegen.

public class DecimalDigitsInputFilter implements InputFilter {

private final Pattern mPattern;

public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero) {
    mPattern = Pattern.compile(String.format("[0-9]{0,%d}(\\.[0-9]{0,%d})?", digitsBeforeZero, digitsAfterZero));
}

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    Matcher matcher = mPattern.matcher(createResultString(source, start, end, dest, dstart, dend));
    if (!matcher.matches())
        return "";
    return null;
}

private String createResultString(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    String sourceString = source.toString();
    String destString = dest.toString();
    return destString.substring(0, dstart) + sourceString.substring(start, end) + destString.substring(dend);
}

}}

tmorcinek
quelle
Es ist fast das, was reisub hier im Jahr 2014 auf dieselbe Frage beantwortet hat.
Mehul Joisar
5
DecimalFormat form = new DecimalFormat("#.##", new DecimalFormatSymbols(Locale.US));
    EditText et; 
    et.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

        if (actionId == EditorInfo.IME_ACTION_DONE) {
            double a = Double.parseDouble(et.getText().toString());
            et.setText(form.format(a));
        }
        return false;
    }
});

Wenn Sie die Bearbeitungsphase beenden, wird das Feld in das richtige Format formatiert. In diesem Moment hat es nur 2 Dezimalzeichen. Ich denke, das ist ein ziemlich einfacher Weg, dies zu tun.

Sipka
quelle
4

Alle Antworten hier sind ziemlich komplex. Ich habe versucht, es viel einfacher zu machen. Sehen Sie sich meinen Code an und entscheiden Sie selbst -

int temp  = 0;
int check = 0;

editText.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

        if(editText.getText().toString().length()<temp)
        {
            if(!editText.getText().toString().contains("."))
                editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(editText.getText().toString().length()-1) });
            else
                editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(editText.getText().toString().length()+1) });

        }

        if(!editText.getText().toString().contains("."))
        {
            editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(editText.getText().toString().length()+1) });
            check=0;
        }


        else if(check==0)
        {
            check=1;
            editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(editText.getText().toString().length()+2) });
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
        temp = editText.getText().toString().length();


    }

    @Override
    public void afterTextChanged(Editable s) {
        // TODO Auto-generated method stub

    }
});
mjosh
quelle
Es funktioniert perfekt für mich. Ich habe alle Szenarien überprüft. Vielen Dank.
Amarnath Baitha
Angenommen, ich habe 1234.56 eingegeben. Jetzt möchte ich es wie folgt bearbeiten: 12378.56. Ich kann es nicht tun, ohne die Dezimalstelle zu löschen.
Aman Verma
4

Die Antwort von Pinhassi hat mir sehr gut gefallen, aber ich habe festgestellt, dass Sie nach Eingabe der angegebenen Ziffern nach dem Dezimalpunkt keinen Text mehr auf der linken Seite des Dezimalpunkts eingeben können. Das Problem war, dass die Lösung nur den zuvor eingegebenen Text testete, nicht den aktuell eingegebenen Text. Hier ist meine Lösung, die das neue Zeichen zur Validierung in den Originaltext einfügt.

package com.test.test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.text.InputFilter;
import android.text.Spanned;
import android.util.Log;

public class InputFilterCurrency implements InputFilter {
    Pattern moPattern;

    public InputFilterCurrency(int aiMinorUnits) {
        // http://www.regexplanet.com/advanced/java/index.html
        moPattern=Pattern.compile("[0-9]*+((\\.[0-9]{0,"+ aiMinorUnits + "})?)||(\\.)?");

    } // InputFilterCurrency

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        String lsStart  = "";
        String lsInsert = "";
        String lsEnd    = "";
        String lsText   = "";

        Log.d("debug", moPattern.toString());
        Log.d("debug", "source: " + source + ", start: " + start + ", end:" + end + ", dest: " + dest + ", dstart: " + dstart + ", dend: " + dend );

        lsText = dest.toString();

        // If the length is greater then 0, then insert the new character
        // into the original text for validation
        if (lsText.length() > 0) {

            lsStart = lsText.substring(0, dstart);
            Log.d("debug", "lsStart : " + lsStart);
            // Check to see if they have deleted a character
            if (source != "") {
                lsInsert = source.toString();
                Log.d("debug", "lsInsert: " + lsInsert);
            } // if
            lsEnd = lsText.substring(dend);
            Log.d("debug", "lsEnd   : " + lsEnd);
            lsText = lsStart + lsInsert + lsEnd;
            Log.d("debug", "lsText  : " + lsText);

        } // if

        Matcher loMatcher = moPattern.matcher(lsText);
        Log.d("debug", "loMatcher.matches(): " + loMatcher.matches() + ", lsText: " + lsText);
        if(!loMatcher.matches()) {
            return "";
        }
        return null;

    } // CharSequence

} // InputFilterCurrency

Und der Aufruf zum Setzen des editText-Filters

editText.setFilters(new InputFilter[] {new InputFilterCurrency(2)});

Ouput with two decimal places
05-22 15:25:33.434: D/debug(30524): [0-9]*+((\.[0-9]{0,2})?)||(\.)?
05-22 15:25:33.434: D/debug(30524): source: 5, start: 0, end:1, dest: 123.4, dstart: 5, dend: 5
05-22 15:25:33.434: D/debug(30524): lsStart : 123.4
05-22 15:25:33.434: D/debug(30524): lsInsert: 5
05-22 15:25:33.434: D/debug(30524): lsEnd   : 
05-22 15:25:33.434: D/debug(30524): lsText  : 123.45
05-22 15:25:33.434: D/debug(30524): loMatcher.matches(): true, lsText: 123.45

Ouput inserting a 5 in the middle
05-22 15:26:17.624: D/debug(30524): [0-9]*+((\.[0-9]{0,2})?)||(\.)?
05-22 15:26:17.624: D/debug(30524): source: 5, start: 0, end:1, dest: 123.45, dstart: 2, dend: 2
05-22 15:26:17.624: D/debug(30524): lsStart : 12
05-22 15:26:17.624: D/debug(30524): lsInsert: 5
05-22 15:26:17.624: D/debug(30524): lsEnd   : 3.45
05-22 15:26:17.624: D/debug(30524): lsText  : 1253.45
05-22 15:26:17.624: D/debug(30524): loMatcher.matches(): true, lsText: 1253.45
David Murry
quelle
4

Ich habe die Lösung verbessert, die einen regulären Ausdruck von Pinhassi verwendet, damit auch die Randfälle korrekt behandelt werden. Bevor überprüft wird, ob die Eingabe korrekt ist, wird zunächst die endgültige Zeichenfolge wie in den Android-Dokumenten beschrieben erstellt.

public class DecimalDigitsInputFilter implements InputFilter {

    private Pattern mPattern;

    private static final Pattern mFormatPattern = Pattern.compile("\\d+\\.\\d+");

    public DecimalDigitsInputFilter(int digitsBeforeDecimal, int digitsAfterDecimal) {
        mPattern = Pattern.compile(
            "^\\d{0," + digitsBeforeDecimal + "}([\\.,](\\d{0," + digitsAfterDecimal +
                "})?)?$");
    }

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

        String newString =
            dest.toString().substring(0, dstart) + source.toString().substring(start, end) 
            + dest.toString().substring(dend, dest.toString().length());

        Matcher matcher = mPattern.matcher(newString);
        if (!matcher.matches()) {
            return "";
        }
        return null;
    }
}

Verwendung:

editText.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(5,2)});
reisub
quelle
4

Die Simple Helper-Klasse soll verhindern, dass der Benutzer mehr als 2 Nachkommastellen eingibt:

public class CostFormatter  implements TextWatcher {

private final EditText costEditText;

public CostFormatter(EditText costEditText) {
    this.costEditText = costEditText;
}

@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 synchronized void afterTextChanged(final Editable text) {
    String cost = text.toString().trim();

    if(!cost.endsWith(".") && cost.contains(".")){
        String numberBeforeDecimal = cost.split("\\.")[0];
        String numberAfterDecimal = cost.split("\\.")[1];

        if(numberAfterDecimal.length() > 2){
            numberAfterDecimal = numberAfterDecimal.substring(0, 2);
        }
        cost = numberBeforeDecimal + "." + numberAfterDecimal;
    }
    costEditText.removeTextChangedListener(this);
    costEditText.setText(cost);
    costEditText.setSelection(costEditText.getText().toString().trim().length());
    costEditText.addTextChangedListener(this);
}
}
Santhosh
quelle
4

Ich habe die Antwort №6 (von Favas Kv) geändert, weil Sie dort nur einen Punkt an die erste Stelle setzen können.

final InputFilter [] filter = { new InputFilter() {

    @Override
    public CharSequence filter(CharSequence source, int start, int end,
                               Spanned dest, int dstart, int dend) {
        StringBuilder builder = new StringBuilder(dest);
        builder.replace(dstart, dend, source
                .subSequence(start, end).toString());
        if (!builder.toString().matches(
                "(([1-9]{1})([0-9]{0,4})?(\\.)?)?([0-9]{0,2})?"

        )) {
            if(source.length()==0)
                return dest.subSequence(dstart, dend);
            return "";
        }
        return null;
    }
}};
koa73
quelle
3

Wie andere sagten, habe ich diese Klasse in mein Projekt aufgenommen und den Filter auf gesetzt EditText gewünschten Wert gesetzt.

Der Filter wird aus der Antwort von @ Pixel kopiert. Ich füge einfach alles zusammen.

public class DecimalDigitsInputFilter implements InputFilter {

    Pattern mPattern;

    public DecimalDigitsInputFilter() {
        mPattern = Pattern.compile("([1-9]{1}[0-9]{0,2}([0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)");

    }

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

        String formatedSource = source.subSequence(start, end).toString();

        String destPrefix = dest.subSequence(0, dstart).toString();

        String destSuffix = dest.subSequence(dend, dest.length()).toString();

        String result = destPrefix + formatedSource + destSuffix;

        result = result.replace(",", ".");

        Matcher matcher = mPattern.matcher(result);

        if (matcher.matches()) {
            return null;
        }

        return "";
    }
}

Stellen Sie nun den Filter EditTextso ein.

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

Hier ist eine wichtige Sache, die mein Problem löst, dass nicht mehr als zwei Ziffern nach dem Dezimalpunkt angezeigt werden dürfen. EditTextDas Problem ist jedoch, getText()dass EditTextdie gesamte eingegebene Eingabe zurückgegeben wird.

Nachdem EditTextich den Filter über angewendet habe, habe ich beispielsweise versucht, den Eingang 1.5699856987 einzustellen. Auf dem Bildschirm wird also 1,56 angezeigt, was perfekt ist.

Dann wollte ich diese Eingabe für einige andere Berechnungen verwenden, um den Text aus diesem Eingabefeld ( EditText) abzurufen . Als ich anriefmEditText.getText().toString() anrief, gab es 1.5699856987 zurück, was in meinem Fall nicht akzeptabel war.

Also musste ich den Wert erneut analysieren, nachdem ich ihn von der erhalten hatte EditText.

BigDecimal amount = new BigDecimal(Double.parseDouble(mEditText.getText().toString().trim()))
    .setScale(2, RoundingMode.HALF_UP);

setScalemacht den Trick hier, nachdem der vollständige Text aus dem EditText.

Reaz Murshed
quelle
Hallo, wie kann ich sicherstellen, dass der Benutzer nicht mehr als 2 Stellen eingeben kann, wenn er keine Dezimalzahl (.) Eingebt?
ManishNegi
2

Ich bin auch auf dieses Problem gestoßen. Ich wollte den Code in vielen EditTexts wiederverwenden können. Das ist meine Lösung:

Verwendung :

CurrencyFormat watcher = new CurrencyFormat();
priceEditText.addTextChangedListener(watcher);

Klasse:

public static class CurrencyFormat implements TextWatcher {

    public void onTextChanged(CharSequence arg0, int start, int arg2,int arg3) {}

    public void beforeTextChanged(CharSequence arg0, int start,int arg2, int arg3) {}

    public void afterTextChanged(Editable arg0) {
        int length = arg0.length();
        if(length>0){
            if(nrOfDecimal(arg0.toString())>2)
                    arg0.delete(length-1, length);
        }

    }


    private int nrOfDecimal(String nr){
        int len = nr.length();
        int pos = len;
        for(int i=0 ; i<len; i++){
            if(nr.charAt(i)=='.'){
                pos=i+1;
                    break;
            }
        }
        return len-pos;
    }
}
Tom
quelle
2

@Meh für dich ..

txtlist.setFilters(new InputFilter[] { new DigitsKeyListener( Boolean.FALSE,Boolean.TRUE) {

        int beforeDecimal = 7;
        int afterDecimal = 2;

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

            String etText = txtlist.getText().toString();
            String temp = txtlist.getText() + source.toString();
            if (temp.equals(".")) {
                return "0.";
            } else if (temp.toString().indexOf(".") == -1) {
                // no decimal point placed yet
                 if (temp.length() > beforeDecimal) {
                    return "";
                }
            } else {
                int dotPosition ;
                int cursorPositon = txtlistprice.getSelectionStart();
                if (etText.indexOf(".") == -1) {
                    dotPosition = temp.indexOf(".");
                }else{
                    dotPosition = etText.indexOf(".");
                }
                if(cursorPositon <= dotPosition){
                    String beforeDot = etText.substring(0, dotPosition);
                    if(beforeDot.length()<beforeDecimal){
                        return source;
                    }else{
                        if(source.toString().equalsIgnoreCase(".")){
                            return source;
                        }else{
                            return "";
                        }
                    }
                }else{
                    temp = temp.substring(temp.indexOf(".") + 1);
                    if (temp.length() > afterDecimal) {
                        return "";
                    }
                }
            }
            return super.filter(source, start, end, dest, dstart, dend);
        }
    } });
RaRa
quelle
2

Eine sehr späte Antwort: Wir können es einfach so machen:

etv.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) {
            if (s.toString().length() > 3 && s.toString().contains(".")) {
                if (s.toString().length() - s.toString().indexOf(".") > 3) {
                    etv.setText(s.toString().substring(0, s.length() - 1));
                    etv.setSelection(edtSendMoney.getText().length());
                }
            }
        }

        @Override
        public void afterTextChanged(Editable arg0) {
        }
}
NanPd
quelle
2

Hier ist die TextWatcher, die nur n Nachkommastellen zulässt .

TextWatcher

private static boolean flag;
public static TextWatcher getTextWatcherAllowAfterDeci(final int allowAfterDecimal){

    TextWatcher watcher = new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            String str = s.toString();
            int index = str.indexOf ( "." );
            if(index>=0){
                if((index+1)<str.length()){
                    String numberD = str.substring(index+1);
                    if (numberD.length()!=allowAfterDecimal) {
                        flag=true;
                    }else{
                        flag=false;
                    }   
                }else{
                    flag = false;
                }                   
            }else{
                flag=false;
            }
            if(flag)
                s.delete(s.length() - 1,
                        s.length());
        }
    };
    return watcher;
}

Wie benutzt man

yourEditText.addTextChangedListener(getTextWatcherAllowAfterDeci(1));
Hiren Dabhi
quelle
Klappt wunderbar!!. Danke Hiren :)
nisha.113a5
2

Der einfachste Weg, dies zu erreichen, ist:

et.addTextChangedListener(new TextWatcher() {
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
        String text = arg0.toString();
        if (text.contains(".") && text.substring(text.indexOf(".") + 1).length() > 2) {
            et.setText(text.substring(0, text.length() - 1));
            et.setSelection(et.getText().length());
        }
    }

    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {

    }

    public void afterTextChanged(Editable arg0) {
    }
});
Sasa Ilic
quelle
Einfache und perfekte Antwort
Logo
1

Hier ist meine Lösung:

     yourEditText.addTextChangedListener(new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            NumberFormat formatter = new DecimalFormat("#.##");
            double doubleVal = Double.parseDouble(s.toString());
            yourEditText.setText(formatter.format(doubleVal));
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,int after) {}

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

Wenn der Benutzer eine Zahl mit mehr als zwei Zahlen nach dem Dezimalpunkt eingibt, wird diese automatisch korrigiert.

Ich hoffe ich habe geholfen!

lopez.mikhael
quelle
Haben Sie diesen Code getestet? Es kann nicht wirklich funktionieren, da der TextWatcher bei jedem Aufruf von setText () erneut ausgelöst wird => Endlosschleife.
Muetzenflo
06-07 08: 01: 35.006: E / AndroidRuntime (30230): java.lang.StackOverflowError funktioniert nicht
Anjula
1

Das funktioniert gut für mich. Damit kann der Wert auch dann eingegeben werden, wenn der Fokus geändert und wieder abgerufen wurde. Zum Beispiel: 123.00, 12.12, 0.01, etc ..

1. Integer.parseInt(getString(R.string.valuelength)) Gibt die Länge der Eingabe digits.Valuesan, auf die über die string.xmlDatei zugegriffen wird. Das Ändern von Werten ist recht einfach. 2. Integer.parseInt(getString(R.string.valuedecimal))Dies ist für die maximale Grenze der Dezimalstellen.

private InputFilter[] valDecimalPlaces;
private ArrayList<EditText> edittextArray;

valDecimalPlaces = new InputFilter[] { new DecimalDigitsInputFilterNew(
    Integer.parseInt(getString(R.string.valuelength)),
    Integer.parseInt(getString(R.string.valuedecimal))) 
};

Array von EditTextWerten, mit denen Aktionen ausgeführt werden können.

for (EditText etDecimalPlace : edittextArray) {
            etDecimalPlace.setFilters(valDecimalPlaces);

Ich habe gerade ein Array von Werten verwendet, die mehrere edittext Next- DecimalDigitsInputFilterNew.classDateien enthalten.

import android.text.InputFilter;
import android.text.Spanned;

public class DecimalDigitsInputFilterNew implements InputFilter {

    private final int decimalDigits;
    private final int before;

    public DecimalDigitsInputFilterNew(int before ,int decimalDigits) {
        this.decimalDigits = decimalDigits;
        this.before = before;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end,
        Spanned dest, int dstart, int dend) {
        StringBuilder builder = new StringBuilder(dest);
        builder.replace(dstart, dend, source
              .subSequence(start, end).toString());
        if (!builder.toString().matches("(([0-9]{1})([0-9]{0,"+(before-1)+"})?)?(\\.[0-9]{0,"+decimalDigits+"})?")) {
             if(source.length()==0)
                  return dest.subSequence(dstart, dend);
             return "";
        }
        return null;
    }
}
Karthi Keyan
quelle
1

Dies soll auf Pinhassis Antwort aufbauen - das Problem, auf das ich gestoßen bin, war, dass Sie nach Erreichen der Dezimalgrenze keine Werte vor der Dezimalstelle hinzufügen konnten. Um das Problem zu beheben, müssen wir die endgültige Zeichenfolge erstellen, bevor wir die Musterübereinstimmung durchführen.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.text.InputFilter;
import android.text.Spanned;

public class DecimalLimiter implements InputFilter
{
    Pattern mPattern;

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

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) 
    {
        StringBuilder sb = new StringBuilder(dest);
        sb.insert(dstart, source, start, end);

        Matcher matcher = mPattern.matcher(sb.toString());
        if(!matcher.matches())
            return "";
        return null;
    }
}
Robert Conley
quelle
1
et = (EditText) vw.findViewById(R.id.tx_edittext);

et.setFilters(new InputFilter[] {
        new DigitsKeyListener(Boolean.FALSE, Boolean.TRUE) {
            int beforeDecimal = 5, afterDecimal = 2;

            @Override
            public CharSequence filter(CharSequence source, int start, int end,
                    Spanned dest, int dstart, int dend) {
                String temp = et.getText() + source.toString();

                if (temp.equals(".")) {
                    return "0.";
                }
                else if (temp.toString().indexOf(".") == -1) {
                    // no decimal point placed yet
                    if (temp.length() > beforeDecimal) {
                        return "";
                    }
                } else {
                    temp = temp.substring(temp.indexOf(".") + 1);
                    if (temp.length() > afterDecimal) {
                        return "";
                    }
                }

                return super.filter(source, start, end, dest, dstart, dend);
            }
        }
});
Pawan Shukla
quelle
Ungefähr 2 Jahre nach Ihrer Antwortzeit. Ich habe versucht , den Code zu verwenden , dann habe ich das Problem über Ihre Lösung gefunden , die Sie anhängen sourcenach et.getText(). Es versteht sich immer, dass Personen am Ende der Box anstatt am Anfang der Box tippen. StringBuilder stringBuilder = new StringBuilder(text.getText().toString()); stringBuilder.replace(dstart, dend, source.toString()); String temp = stringBuilder.toString();sollte arbeiten. Danke trotzdem.
Truong Hieu
1

Erstellen Sie eine neue Klasse in Android Kotlin mit dem Namen DecimalDigitsInputFilter

class DecimalDigitsInputFilter(digitsBeforeZero: Int, digitsAfterZero: Int) : InputFilter {
lateinit var mPattern: Pattern
init {
    mPattern =
        Pattern.compile("[0-9]{0," + (digitsBeforeZero) + "}+((\\.[0-9]{0," + (digitsAfterZero) + "})?)||(\\.)?")
}
override fun filter(
    source: CharSequence?,
    start: Int,
    end: Int,
    dest: Spanned?,
    dstart: Int,
    dend: Int
): CharSequence? {
    val matcher: Matcher = mPattern.matcher(dest?.subSequence(0, dstart).toString() + source?.subSequence(start, end).toString() + dest?.subSequence(dend, dest?.length!!).toString())
    if (!matcher.matches())
        return ""
    else
        return null
}

Rufen Sie diese Klasse mit der folgenden Zeile auf

 et_buy_amount.filters = (arrayOf<InputFilter>(DecimalDigitsInputFilter(8,2)))

Es gibt zu viele Antworten für dasselbe, aber Sie können 8 Stellen vor der Dezimalstelle und 2 Stellen nach der Dezimalstelle eingeben

Andere Antworten akzeptieren nur 8 Ziffern

Sagar Bandamwar
quelle