Ich versuche eine App zu schreiben, mit der Sie Ihre Finanzen verwalten können. Ich verwende ein EditText
Feld, in dem der Benutzer einen Geldbetrag angeben kann.
Ich habe festgelegt, inputType
auf numberDecimal
welche Weise gut funktioniert, außer dass die Leute dadurch Zahlen eingeben können, 123.122
die nicht perfekt für Geld sind.
Gibt es eine Möglichkeit, die Anzahl der Zeichen nach dem Dezimalpunkt auf zwei zu beschränken?
java
android
android-edittext
Konstantin Weitz
quelle
quelle
InputFilter
Schnittstelle gefunden, sie scheint zu tun, was ich will. Developer.android.com/reference/android/text/method/… , aber die Methodefilter
, die ich implementieren muss, ist für mich ziemlich verwirrend. Hat jemand schon einen solchen Filter geschrieben und weiß, wie man ihn benutzt?Antworten:
Ein eleganterer Weg wäre die Verwendung eines regulären Ausdrucks (Regex) wie folgt:
Um es zu benutzen, tun Sie:
quelle
Einfachere Lösung ohne Verwendung von Regex:
Benutzen:
quelle
Diese Implementierung von
InputFilter
löst das Problem.quelle
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
quelle
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.
quelle
android:inputType="number"
oderandroid:inputType="numberDecimal"
es nicht erlaubt, Minusandroid:digits="0123456789.-"
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
Stellen Sie den EditText im Layout auf:
android: inputType = "numberDecimal"
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
Schließen Sie diese Funktion ein:
Und es ist geschafft!
quelle
Ich habe dies mit Hilfe von
TextWatcher
auf folgende Weise erreichtBei 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.
quelle
count
mit zu initialisieren-1
. Dann funktioniert nur das richtig.int count = -1;
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.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.
quelle
Die Anforderung ist 2 Nachkommastellen. Es sollte keine Begrenzung für Ziffern vor dem Dezimalpunkt geben. Die Lösung sollte also sein:
Und benutze es als,
Vielen Dank an @Pinhassi für die Inspiration.
quelle
Meine Lösung ist einfach und funktioniert perfekt!
Verwendung:
quelle
isValid()
zu Konstruktor, um zu vermeiden, dass Muster bei jedemisValid()
Aufruf neu erstellt werden.Versuchen Sie es mit NumberFormat.getCurrencyInstance () um Ihre Zeichenfolge zu formatieren, bevor Sie sie in eine Textansicht einfügen.
Etwas wie:
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
TextWatcher
auf Ihrem Code festgelegten Code verwendenEditText
.quelle
Leicht verbesserte @ Pinhassi-Lösung.
Funktioniert sehr gut. Es validiert verkettete Zeichenfolgen.
quelle
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.
}}
quelle
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.
quelle
Alle Antworten hier sind ziemlich komplex. Ich habe versucht, es viel einfacher zu machen. Sehen Sie sich meinen Code an und entscheiden Sie selbst -
quelle
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.
Und der Aufruf zum Setzen des editText-Filters
quelle
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.
Verwendung:
quelle
Die Simple Helper-Klasse soll verhindern, dass der Benutzer mehr als 2 Nachkommastellen eingibt:
quelle
Ich habe die Antwort №6 (von Favas Kv) geändert, weil Sie dort nur einen Punkt an die erste Stelle setzen können.
quelle
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.
Stellen Sie nun den Filter
EditText
so ein.Hier ist eine wichtige Sache, die mein Problem löst, dass nicht mehr als zwei Ziffern nach dem Dezimalpunkt angezeigt werden dürfen.
EditText
Das Problem ist jedoch,getText()
dassEditText
die gesamte eingegebene Eingabe zurückgegeben wird.Nachdem
EditText
ich 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
.setScale
macht den Trick hier, nachdem der vollständige Text aus demEditText
.quelle
Ich bin auch auf dieses Problem gestoßen. Ich wollte den Code in vielen EditTexts wiederverwenden können. Das ist meine Lösung:
Verwendung :
Klasse:
quelle
@Meh für dich ..
quelle
Eine sehr späte Antwort: Wir können es einfach so machen:
quelle
Hier ist die
TextWatcher
, die nur n Nachkommastellen zulässt .TextWatcher
Wie benutzt man
quelle
Der einfachste Weg, dies zu erreichen, ist:
quelle
Hier ist meine Lösung:
Wenn der Benutzer eine Zahl mit mehr als zwei Zahlen nach dem Dezimalpunkt eingibt, wird diese automatisch korrigiert.
Ich hoffe ich habe geholfen!
quelle
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 Eingabedigits.Values
an, auf die über diestring.xml
Datei 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.Array von
EditText
Werten, mit denen Aktionen ausgeführt werden können.Ich habe gerade ein Array von Werten verwendet, die mehrere edittext Next-
DecimalDigitsInputFilterNew.class
Dateien enthalten.quelle
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.
quelle
quelle
source
nachet.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.Erstellen Sie eine neue Klasse in Android Kotlin mit dem Namen DecimalDigitsInputFilter
Rufen Sie diese Klasse mit der folgenden Zeile auf
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
quelle