Ich habe eine Menge Anleitungen dazu gefunden, wie man das in objective-c tun kann, aber ich würde gerne eine Swift-orientierte Art sehen, dies zu tun.
Ich habe ein UITextField, in das ein Benutzer einen Währungspreis eingibt. Das Textfeld ruft eine Tastatur mit Dezimaltrennzeichen auf. Auf dem iPad hat die Tastatur jedoch eine ganze Reihe von Nicht-Dezimal-Symbolen.
Grundsätzlich möchte ich für jeden einzelnen Tastendruck verhindern, dass eine Nicht-Zahl oder irgendetwas anderes als eine einzelne Dezimalzahl in das Feld eingegeben wird. Wenn eine Dezimalzahl eingegeben wird, möchte ich es vermeiden, eine zweite Dezimalzahl einzugeben. Wenn die Dezimalstelle gelöscht wird, möchte ich sicherstellen, dass der Benutzer eine Dezimalzahl erneut eingeben kann.
Irgendwelche Ideen, wie man das in swift richtig macht?
Ich sehe auch Lösungen wie die hier geposteten: Begrenzen Sie UITextField auf eine Dezimalstelle Swift Aber ich habe keine Ahnung, wo ich die Funktionen platzieren soll oder wie ich sie nennen soll. Immer wenn ich versuche, NSRange in die Parameter einzutragen, erhalte ich einen Fehler, dass ich keinen Bereich richtig erstelle.
Dies berücksichtigt mehrere Dezimalstellen, indem Sie mit einem NSScanner testen, ob die neue Zeichenfolge numerisch wäre:
%Vor% Das ist von der Antwort von Wye inspiriert, ist aber etwas kompakter und hat für mich funktioniert, wo ich ein numerisches / dezimales Feld haben wollte. Sie können sich anpassen, um ganze Zahlen zu akzeptieren, indem Sie die Regex ändern (nehmen Sie .?\d{0,2}
heraus und verlassen Sie sie mit ^\d*$
). Wenn Sie die Anzahl der Nachkommastellen nicht einschränken möchten, können Sie diese Einschränkung ebenfalls entfernen (ändern Sie sie einfach in ^\d*\.?\d*
)
Dadurch kann die numerische Zeichenkette ohne Zurückweisung von Eingaben auf dem Weg konstruiert werden, so dass beispielsweise alle folgenden Eingaben gültig sind und (newString as NSString).floatValue
ein gültiges Ergebnis liefert:
(d. h. die leere Zeichenfolge) ergibt 0.0 .
ergibt 0.0 1.
ergibt 1.0 .1
ergibt 0,1 Swift 3 Implementieren Sie diese UITextFieldDelegate-Methode, um zu verhindern, dass Benutzer eine ungültige Zahl eingeben:
%Vor%Es arbeitet mit Komma oder Punkt als Dezimaltrennzeichen und erlaubt 2 Bruchzahlen.
Hier ist was ich benutze. Wenn dies false zurückgibt, entfernt der Aufrufer das letzte (beleidigende) Zeichen mit textField.deleteBackward()
.
Oder Sie könnten alles innerhalb der Funktion tun:
%Vor%Beide sind kurz, klar, einfach und effizient. (Scheint der zweite ist sauberer ... Meinungen?) Aber sie beschränken die Eingabe nicht auf einen einzigen Dezimalpunkt ...
Swift 2 Version von @Steve Rosenbergs Lösung
Wenn Sie die Eingabe nicht auf maximal 2 Nachkommastellen beschränken müssen (d. h. "12.34" OK, "12.345" nicht OK), entfernen Sie die 4 Zeilen am Anfang.
%Vor%Alle Antworten verwenden '.' als gültiges Trennzeichen für Dezimalstellen, aber in verschiedenen Lokalisierungen kann es falsch sein.
%Vor%Hier ist ein einfaches Beispiel:
%Vor%Hier ist die einfachste Methode:
%Vor%Das ist von der Antwort von Wye inspiriert, ist aber etwas kompakter und hat für mich funktioniert, wo ich ein numerisches / dezimales Feld haben wollte. Sie können sich anpassen, um ganze Zahlen zu akzeptieren, indem Sie die Regex ändern (nehmen Sie %code% heraus und verlassen Sie sie mit %code% ). Wenn Sie die Anzahl der Nachkommastellen nicht einschränken möchten, können Sie diese Einschränkung ebenfalls entfernen (ändern Sie sie einfach in %code% )
%Vor%Dadurch kann die numerische Zeichenkette ohne Zurückweisung von Eingaben auf dem Weg konstruiert werden, so dass beispielsweise alle folgenden Eingaben gültig sind und %code% ein gültiges Ergebnis liefert:
Ich habe eine Menge Anleitungen dazu gefunden, wie man das in objective-c tun kann, aber ich würde gerne eine Swift-orientierte Art sehen, dies zu tun.
Ich habe ein UITextField, in das ein Benutzer einen Währungspreis eingibt. Das Textfeld ruft eine Tastatur mit Dezimaltrennzeichen auf. Auf dem iPad hat die Tastatur jedoch eine ganze Reihe von Nicht-Dezimal-Symbolen.
Grundsätzlich möchte ich für jeden einzelnen Tastendruck verhindern, dass eine Nicht-Zahl oder irgendetwas anderes als eine einzelne Dezimalzahl in das Feld eingegeben wird. Wenn eine Dezimalzahl eingegeben wird, möchte ich es vermeiden, eine zweite Dezimalzahl einzugeben. Wenn die Dezimalstelle gelöscht wird, möchte ich sicherstellen, dass der Benutzer eine Dezimalzahl erneut eingeben kann.
Irgendwelche Ideen, wie man das in swift richtig macht?
Ich sehe auch Lösungen wie die hier geposteten: Begrenzen Sie UITextField auf eine Dezimalstelle Swift Aber ich habe keine Ahnung, wo ich die Funktionen platzieren soll oder wie ich sie nennen soll. Immer wenn ich versuche, NSRange in die Parameter einzutragen, erhalte ich einen Fehler, dass ich keinen Bereich richtig erstelle.
Getestet und funktioniert in Swift 3 und Swift 4 . Sie können auch die folgenden Prüfungen durchführen
%Vor%Swift 3 Implementieren Sie diese UITextFieldDelegate-Methode, um zu verhindern, dass Benutzer eine ungültige Zahl eingeben:
%Vor%Es arbeitet mit Komma oder Punkt als Dezimaltrennzeichen und erlaubt 2 Bruchzahlen.
Mach es genauso. Der unten stehende Code schützt nicht gegen mehrere %code% , tut aber ansonsten das, was Sie wollen. Erweitere es wie du willst.
%Vor%Hier ist was ich benutze. Wenn dies false zurückgibt, entfernt der Aufrufer das letzte (beleidigende) Zeichen mit %code% .
%Vor%Oder Sie könnten alles innerhalb der Funktion tun:
%Vor%Beide sind kurz, klar, einfach und effizient. (Scheint der zweite ist sauberer ... Meinungen?) Aber sie beschränken die Eingabe nicht auf einen einzigen Dezimalpunkt ...
SWIFT 3.2 und 4.0 Chis wird den Benutzer auf zwei Dezimalstellen beschränken und sie auf ein Komma beschränken. Stellen Sie sicher, dass Sie den Tastaturtyp auf Dezimal stellen.
%Vor%Verbessern Sie Naishtas Antwort in Swift 4 , hier ist ein Ausschnitt, mit dem Sie die Länge des Textfelds auf 10 Zeichen beschränken können ( Extra-Bonus - nicht von Post-Ersteller angefordert ) und eine einzelne Dezimalstelle :
%Vor%Dies berücksichtigt mehrere Dezimalstellen, indem Sie mit einem NSScanner testen, ob die neue Zeichenfolge numerisch wäre:
%Vor%SWIFT 3.2 und 4.0 Chis wird den Benutzer auf zwei Dezimalstellen beschränken und sie auf ein Komma beschränken. Stellen Sie sicher, dass Sie den Tastaturtyp auf Dezimal stellen.
%Vor%Tags und Links objective-c ios ipad swift