Ich habe einen editText, der Startwert ist $ 0.00. Wenn Sie 1 drücken, ändert sich der Wert auf 0,01 USD. Drücken Sie 4, es geht auf 0,14 $. Drücken Sie 8, 1,48 $. Drücken Sie die Rücktaste, 0,14 USD usw.
Das funktioniert, das Problem ist, wenn jemand den Cursor manuell positioniert, treten Probleme bei der Formatierung auf. Wenn sie die Dezimalstelle löschen, wird sie nicht zurückgegeben. Wenn sie den Cursor vor die Dezimalstelle setzen und 2 eingeben, wird $ 02.00 anstelle von $ 2.00 angezeigt. Wenn sie versuchen, das $ zu löschen, wird stattdessen beispielsweise eine Ziffer gelöscht.
Hier ist Code, den ich verwende. Ich würde mich über Vorschläge freuen.
mEditPrice.setRawInputType(Configuration.KEYBOARD_12KEY);
public void priceClick(View view) {
mEditPrice.addTextChangedListener(new TextWatcher(){
DecimalFormat dec = new DecimalFormat("0.00");
@Override
public void afterTextChanged(Editable arg0) {
}
@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().matches("^\\$(\\d{1,3}(\\,\\d{3})*|(\\d+))(\\.\\d{2})?$"))
{
String userInput= ""+s.toString().replaceAll("[^\\d]", "");
if (userInput.length() > 0) {
Float in=Float.parseFloat(userInput);
float percen = in/100;
mEditPrice.setText("$"+dec.format(percen));
mEditPrice.setSelection(mEditPrice.getText().length());
}
}
}
});
Antworten:
Ich habe Ihre Methode getestet, aber sie schlägt fehl, wenn ich große Zahlen verwende ... Ich habe Folgendes erstellt:
quelle
String replaceable = String.format("[%s,.]", NumberFormat.getCurrencyInstance().getCurrency().getSymbol()); String cleanString = s.toString().replaceAll(replaceable, "");
String replaceable = String.format("[%s,.\\s]", NumberFormat.getCurrencyInstance().getCurrency().getSymbol());
onTextChanged() and rather to do so in
afterTextChanged () `double
10 geändert wird.10 / 100 = 0,1
Sie können nicht daran vorbei.Basierend auf einigen der obigen Antworten habe ich einen MoneyTextWatcher erstellt, den Sie wie folgt verwenden würden:
und hier ist die Klasse:
quelle
java.lang.NumberFormatException: Bad offset/length
.replaceAll("[^0-9]", "")
, der obige hat ein Limit von 9.999.999 -_-Hier ist mein Brauch
CurrencyEditText
Verwenden Sie es in XML wie
Sie sollten unten 2 Konstanten bearbeiten, um sie für Ihr Projekt zu verwenden
Demo auf Github
quelle
formatter.setRoundingMode(RoundingMode.DOWN);
dieformatDecimal
Methode aufzurufen .$.
, wenn wir den Rohwert als erhalten.
und auf Double analysieren, wird NFE angezeigt. Um das Problem zu beheben, kehrte ichformatDecimal()
zurückprefix + "0.";
und wechselte#,###.
nach#,##0.
innenformatDecimal()
. Dies sieht auch besser aus, wenn der Benutzer nur Dezimalstellen eingibt. Es zeigt als$0.25
statt$.25
.Tatsächlich funktioniert die zuvor bereitgestellte Lösung nicht. Es funktioniert nicht, wenn Sie 100.00 eingeben möchten.
Ersetzen:
Mit:
Ich muss sagen, dass ich einige Änderungen an meinem Code vorgenommen habe. Die Sache ist, dass Sie BigDecimal verwenden sollten
quelle
Ich ändere die Klasse mit implementiertem TextWatcher, um brasilianische Währungsformate zu verwenden und die Cursorposition beim Bearbeiten des Werts anzupassen.
quelle
Ich habe auf Guilhermes Antwort aufgebaut, aber ich behalte die Position des Cursors bei und behandle die Punkte auch anders. Wenn ein Benutzer nach dem Punkt tippt, wirkt sich dies nicht auf die Zahlen vor dem Zeitraum aus, bei dem ich finde, dass dies eine sehr reibungslose Eingabe ergibt .
quelle
Auch wenn es hier viele Antworten sind, würde Ich mag diesen Code teilen , dass ich gefunden hier , da ich seine die robusteste und saubere Antwort glauben.
ich hoffe es hilft.
quelle
replaceAll("\\D", "")
entfernt alles, was keine Ziffer ist, so dass "$ 100.00" und "$ 10.000" beide zu "10000" werden. Es scheint, dass Sie auf die Eingabe zählen, um Cent einzuschließen. Also, wenn das garantiert ist, großartig, aber wenn nicht, denke ich, wird es Probleme geben.Ok, hier ist ein besserer Weg, um mit Währungsformaten umzugehen, Rückwärts-Tastendruck löschen. Der Code basiert auf dem obigen @ androidcurious-Code ... Es werden jedoch einige Probleme im Zusammenhang mit dem Löschen von Rückwärtsbewegungen und einige Analyse-Ausnahmen behandelt: http://miguelt.blogspot.ca/2013/01/textwatcher-for-currency-masksformatting .html [UPDATE] Die vorherige Lösung hatte einige Probleme ... Dies ist eine bessere Lösung: http://miguelt.blogspot.ca/2013/02/update-textwatcher-for-currency.html Und ... hier sind die Einzelheiten:
Dieser Ansatz ist besser, da er die herkömmlichen Android-Mechanismen verwendet. Die Idee ist, Werte zu formatieren, nachdem der Benutzer die Ansicht existiert.
Definieren Sie einen InputFilter, um die numerischen Werte einzuschränken. Dies ist in den meisten Fällen erforderlich, da der Bildschirm nicht groß genug ist, um lange EditText-Ansichten aufzunehmen. Dies kann eine statische innere Klasse oder nur eine andere einfache Klasse sein:
Definieren Sie eine Klasse (innere statische oder nur eine Klasse), die View.OnFocusChangeListener implementiert. Beachten Sie, dass ich eine Utils-Klasse verwende. Die Implementierung finden Sie unter "Beträge, Steuern".
Diese Klasse entfernt das Währungsformat beim Bearbeiten - basierend auf Standardmechanismen. Beim Beenden des Benutzers wird das Währungsformat erneut angewendet.
Es ist besser, einige statische Variablen zu definieren, um die Anzahl der Instanzen zu minimieren:
Schließlich in der onCreateView (...):
Sie können FILTERS und ON_FOCUS für eine beliebige Anzahl von EditText-Ansichten wiederverwenden.
Hier ist die Utils-Klasse:
quelle
Ich habe die Implementierung verwendet, auf die Nathan Leigh verwiesen hat, und Kayvan Ns und user2582318s vorgeschlagenen regulären Ausdruck, um alle Zeichen außer Ziffern zu entfernen und die folgende Version zu erstellen:
Dies ist eine Erweiterungsfunktion in Kotlin, die den TextWatcher zum TextChangedListener des EditText hinzufügt.
Um es zu benutzen, einfach:
Ich hoffe, es hilft.
quelle
Ich habe dies von hier erhalten und es geändert, um dem portugiesischen Währungsformat zu entsprechen.
Die layout.xml
Bring es zum Laufen
quelle
Bei mir hat es so funktioniert
quelle
Es ist besser, die InputFilter-Schnittstelle zu verwenden. Mit Regex ist es viel einfacher, Eingaben jeglicher Art zu verarbeiten. Meine Lösung für das Währungseingabeformat:
Gültig: 0,00, 0,0, 10,00, 111,1
Ungültig: 0, 0,000, 111, 10, 010,00, 01,0
Wie benutzt man:
quelle
Ich habe dies verwendet, um dem Benutzer die Eingabe der Währung zu ermöglichen und sie von Zeichenfolge in int zu konvertieren, um sie in db zu speichern und wieder von int in Zeichenfolge zu ändern
https://github.com/nleigh/Restaurant/blob/master/Restaurant/src/uk/co/nathanleigh/restaurant/CurrencyFormat.java
quelle
Wenn Ihr JSON-Währungsfeld vom Nummerntyp (und nicht vom String) ist, kann es 3.1, 3.15 oder nur 3 sein. Da JSON Zahlenfelder automatisch rundet.
In diesem Fall müssen Sie es möglicherweise für eine ordnungsgemäße Anzeige runden (und später eine Maske für ein Eingabefeld verwenden können):
Warum wird das benötigt?
Alle Antworten deuten darauf hin, dass Währungssymbole entfernt werden, wenn Sie eingeben, dass Sie die Cent erhalten, und so Dolar + Cent / 100 = Dolar, Cent formatieren. Wenn Ihr json-Währungsfeld jedoch ein Zahlentyp (und kein String) ist, rundet es Ihre Cent ab. Es kann 3, 3,1 oder 3,15 sein.
quelle
come as 3.1 , 3.15 or just 3. Because json automatically round number fields
- das hat nichts mit Rundung zu tun !ein anderer Ansatz, aber basierend auf Guilherme Antwort . Dieser Ansatz ist nützlich, wenn das Gebietsschema Ihres Landes nicht verfügbar ist oder wenn Sie benutzerdefinierte Währungssymbole verwenden möchten. Diese Implementierung gilt nur für positive Nicht-Dezimalzahlen.
Dieser Code befindet sich in Kotlin, dem ersten Delegierten
setMaskingMoney
fürEditText
Dann
MyTextWatcher
sollte die Schnittstelle von erweitert werdenTextWatcher
. Da wir nurafterTextChanged
Methoden benötigen, müssen die anderen Methoden in dieser Schnittstelle überschrieben werdenund die Monetarisierungsmethoden sind:
Vollständige Implementierungen:
und irgendwo auf der onCreate-Methode:
quelle
Nach zu viel Suche und Fehlschlägen mit Doubles, BigDecimals usw. habe ich diesen Code erstellt. Es funktioniert Plug And Play. Es ist in Kotlin. Also, um anderen zu helfen, die wie ich festsitzen, lass uns gehen.
Der Code ist im Grunde eine Funktion, die einen TextWatcher platziert und das Koma an die richtige Stelle bringt.
Erstellen Sie zunächst diese Funktion:
Und dann rufen Sie diese Funktion so auf
quelle
Nachdem ich mir die meisten StackOverflow-Beiträge auf verschiedene Arten angesehen habe, um dies mit einem ,, oder einer Bibliothek wie CurrencyEditText zu erreichen
TextWatcher
, habe ich mich für diese einfache Lösung mit einem entschieden .InputFilter
OnFocusChangeListener
Die Logik besteht darin, die
EditText
Zahl zu analysieren , wenn sie fokussiert ist, und sie zurück zu formatieren, wenn sie den Fokus verliert.quelle
Ich habe eine Kotlin + Rx-Version implementiert.
Es ist für die brasilianische Währung (z. B. 1.500,00 - 5,21 - 192,90), aber Sie können es problemlos für andere Formate anpassen.
Hoffe, jemand anderes findet es hilfreich.
quelle
CurrencyTextWatcher.java
EditTextCurrency.java
quelle
So konnte ich eine Währung in einem EditText anzeigen, der einfach zu implementieren war und für den Benutzer gut funktioniert, ohne dass überall verrückte Symbole auftreten könnten. Dadurch wird keine Formatierung durchgeführt, bis der EditText keinen Fokus mehr hat. Der Benutzer kann weiterhin zurückgehen und Änderungen vornehmen, ohne die Formatierung zu gefährden. Ich verwende die Variable 'formattedPrice' nur zur Anzeige und die Variable 'itemPrice' als Wert, den ich speichere / für Berechnungen verwende.
Es scheint wirklich gut zu funktionieren, aber ich bin erst seit ein paar Wochen dabei, daher ist jede konstruktive Kritik absolut willkommen!
Die EditText-Ansicht in der XML hat das folgende Attribut:
Globale Variablen:
In der onCreate-Methode:
quelle
Falls jemand daran interessiert ist, dies mit RxBinding und Kotlin zu tun:
quelle
nur ein zusätzlicher Kommentar zur genehmigten Antwort. Beim Bewegen des Cursors auf dem Edittext-Feld kann es aufgrund des Parsens zu einem Absturz kommen. Ich habe eine try catch-Anweisung ausgeführt, aber Ihren eigenen Code implementiert.
quelle
Sie können diese Methoden verwenden
quelle
Kotlin- Version:
quelle
und verwenden Sie diesen Block dann als editText
quelle