Versuch, ein UITextField so zu formatieren, dass es sich wie ein Währungsrechner nur für numerische Eingaben in iOS verhält

8

Ich habe eine UITextField in meiner Anwendung, die nur numerische Eingaben vom Benutzer erhalten soll. Diese numerische Eingabe soll eine Währung darstellen (d. H. Nur zwei Dezimalstellen haben), den Standardwert 0.00 haben, wenn nichts eingegeben wurde. Ich möchte auch ein "$" Zeichen, das ganz links ist, mit der Zahl rechts ausgerichtet, so dass die Zahl von rechts nach links wie folgt bewegt:

z.B. wenn Sie die Nummer "1234.56" eingeben .

1. 0,00 $ .

2. 0,01 $ .

3. 0,12 $ .

4. 1,23 $ .

5. $ 12.34 .

6. $ 123,45 .

7. $ 1,234.56 .

8. und so weiter ...

Ich habe das UITextField right so ausgerichtet, dass es die Zahlen bereits von rechts nach links verschiebt. Allerdings muss ich "$" in das UITextField einfügen, und ich möchte, dass der Standardwert 0.00 auf die eingegebene Zahl geändert wird durch den Benutzer eine Ziffer zu einer Zeit. Der Benutzer sollte NICHT den Dezimalpunkt eingeben müssen, da er bereits in dem Textfeld sein sollte, das seine Position hält. Ich möchte dann, dass die Zahl "," automatisch eingegeben wird, um alle drei Ziffern zu trennen. Ich möchte, dass die Anwendung dies tut WIE DER BENUTZER DIE ZAHLEN EINGEBEN , und nicht danach formatiert wird, wenn alles eingegeben wird. Wie würde ich das tun? Ich habe eine Menge Leute gesehen, die sagen, dass ich NSNumberFormatter benutzen soll, aber ich möchte wissen, wie ich es in Verbindung mit UITextField verwende, so dass es den numerischen Text im laufenden Betrieb formatiert, wie oben beschrieben?

Ich habe vor einiger Zeit die folgende Frage auf StackOverflow gefunden:

Was ist der beste Weg? um numerische Werte mit Dezimalpunkten einzugeben?

aber ich möchte wissen, wie man es tatsächlich als Lösung für mein Problem einbaut.

    
syedfa 05.03.2013, 06:20
quelle

5 Antworten

12

Hier ist ein guter Weg, es zu tun. Denken Sie daran, Ihr UITextField in der viewDidLoad-Methode auf self zu setzen, und Ihre Header-Datei muss dem UITextFieldDelegate-Protokoll entsprechen

%Vor%     
Daniel 21.06.2014, 14:48
quelle
2

Hier ist meine Lösung in Swift. Mein Ansatz verfolgte die eingegebenen Zahlen und multiplizierte sie mit 0,01 und setzte die Ergebnisnummer mit NSNumberFormatter auf 2 Dezimalstellen. Beachten Sie, dass ich die Textfeld-Tastatur als Nummernblock eingestellt habe.

%Vor%     
julien 14.04.2016 18:24
quelle
2

Aktualisierte Antwort für SWIFT 3

%Vor%     
Priyatham51 11.03.2017 09:53
quelle
1

Sie müssen wahrscheinlich das UITextFieldDelegate -Protokoll auschecken. Indem Sie etwas (am häufigsten Ihre ViewController-Klasse) als Delegat des UITextField zuweisen, können Sie interaktive Texteingabeereignisse vom Steuerelement empfangen. Insbesondere:

%Vor%

Wenn Sie NO von dieser Methode zurückgeben, können Sie verhindern, dass das Textfeld die vom Benutzer gedrückten Tasten anwendet.

Obwohl Sie jedoch NO zurückgeben, hindert Sie nichts daran, die Informationen zu verwenden, die an die Delegate-Methode übergeben wurden, um Ihre eigenen Manipulationen an den Inhalten des Textfelds im Code vorzunehmen.

In Pseudo-Code-Form:

%Vor%

Haftungsausschluss: Ich habe keinen tatsächlichen Code zum Testen geschrieben, daher ist es möglich, dass die Änderung des Codes innerhalb dieser Delegate-Methode zur Folge hat, dass eine weitere sentChangeCharactersInRange: message ausgelöst wird. Ich glaube jedoch nicht, dass das der Fall ist. Ich glaube nicht, dass das Delegate-Ereignis ausgelöst wird, wenn Sie den Text in Code ändern.

Dies ist offensichtlich nicht so gut wie ein benutzerdefiniertes Steuerelement, das bereits alle Regeln für eine Zahl Texteingabefeld implementiert (ich habe Flashbacks zu Jahren der Visual Basic-Programmierung jetzt ...). Aber ich kenne keine solche Kontrolle, dass jemand geschrieben und Open-Source ist.

    
Bill Patterson 05.03.2013 07:41
quelle
0

Ich habe die Antwort von Julien genommen und sie so geändert, dass andere Ländereinstellungen mit unterschiedlichen Währungsformaten unterstützt werden. Ich habe auch die Zahlenformatierer zur Wiederverwendung gespeichert, so dass sie nicht jedes Mal erstellt werden, was eine teure Operation ist.

Überlauf wird durch Ignorieren jeglicher Eingaben gehandhabt, die dazu führen würden, dass der gespeicherte Wert überläuft.

Bei dieser Lösung wird davon ausgegangen, dass der Text nur am Ende des Textfelds eingegeben wurde und daher nur am Ende ausgeführt wird, unabhängig davon, wo sich der Textcursor vor der Eingabe befand.

%Vor%

Dies auf einem Spielplatz mit verschiedenen Schauplätzen zu verwenden, gab mir diese Ergebnisse (Entschuldigung, kann nicht direkt direkt einbetten).

    
Jake 27.04.2016 04:10
quelle