Begrenzung der Benutzereingabe auf eine gültige Dezimalzahl in Swift

7

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.

    
zavtra 25.10.2014, 20:19
quelle

13 Antworten

7

Hier ist ein einfaches Beispiel:

%Vor%     
Steve Rosenberg 25.10.2014, 21:16
quelle
6

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%     
wye 20.02.2016 01:30
quelle
4

Dies berücksichtigt mehrere Dezimalstellen, indem Sie mit einem NSScanner testen, ob die neue Zeichenfolge numerisch wäre:

%Vor%     
Lyndsey Scott 25.10.2014 21:25
quelle
3

Alle Antworten verwenden '.' als gültiges Trennzeichen für Dezimalstellen, aber in verschiedenen Lokalisierungen kann es falsch sein.

%Vor%     
miss Gbot 07.02.2018 10:58
quelle
2

Hier ist die einfachste Methode:

%Vor%     
Surendra 25.04.2016 12:45
quelle
2

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

%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 (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
DragonTheHorse 23.08.2016 17:20
quelle
2

Getestet und funktioniert in Swift 3 und Swift 4 . Sie können auch die folgenden Prüfungen durchführen

%Vor%     
Naishta 23.09.2016 22:39
quelle
1

Mach es genauso. Der unten stehende Code schützt nicht gegen mehrere . , tut aber ansonsten das, was Sie wollen. Erweitere es wie du willst.

%Vor%     
Daniel T. 25.10.2014 21:15
quelle
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.

    
Miroslav Hrivik 21.06.2017 15:18
quelle
1

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%     
jerem_y 13.12.2017 03:27
quelle
1

Hier ist was ich benutze. Wenn dies false zurückgibt, entfernt der Aufrufer das letzte (beleidigende) Zeichen mit textField.deleteBackward() .

%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 ...

    
Greg 29.10.2017 19:43
quelle
0
___ answer35518059 ___

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%     
___ qstnhdr ___ Begrenzung der Benutzereingabe auf eine gültige Dezimalzahl in Swift ___ answer48662098 ___

Alle Antworten verwenden '.' als gültiges Trennzeichen für Dezimalstellen, aber in verschiedenen Lokalisierungen kann es falsch sein.

%Vor%     
___ answer26567316 ___

Hier ist ein einfaches Beispiel:

%Vor%     
___ answer36840993 ___

Hier ist die einfachste Methode:

%Vor%     
___ answer39107252 ___

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:

  • %code% (d. h. die leere Zeichenfolge) ergibt 0.0
  • %code% ergibt 0.0
  • %code% ergibt 1.0
  • %code% ergibt 0,1
___ qstntxt ___

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.

    
___ answer39670521 ___

Getestet und funktioniert in Swift 3 und Swift 4 . Sie können auch die folgenden Prüfungen durchführen

%Vor%     
___ answer44680126 ___

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.

    
___ answer26567307 ___

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%     
___ antwort43370376 ___
%Vor%     
___ tag123ios ___ iOS ist das mobile Betriebssystem, das auf dem Apple iPhone, iPod touch und iPad ausgeführt wird. Verwenden Sie dieses Tag [ios] für Fragen zur Programmierung auf der iOS-Plattform. Verwenden Sie die verwandten Tags [objective-c] und [swift] für Probleme, die für diese Programmiersprachen spezifisch sind. ___ answer47004484 ___

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 ...

    
___ tag123objectivec ___ Dieses Tag sollte nur bei Fragen verwendet werden, die sich auf Objective-C-Funktionen beziehen oder von Code in der Sprache abhängen. Die Tags [Kakao] und [Kakao-Touch] sollten verwendet werden, um nach Frameworks oder Klassen von Apple zu fragen. Verwenden Sie die verwandten Tags [ios], [macos], [apple-watch] und [tvos] für Probleme, die für diese Plattformen spezifisch sind. ___ answer49039523 ___

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%     
___ tag123swift ___ Swift ist eine universelle Open-Source-Programmiersprache, die von Apple Inc. für ihre Plattformen und Linux entwickelt wurde. Verwenden Sie das Tag nur für Fragen zu Sprachfunktionen oder für Code in Swift. Verwenden Sie die Tags [ios], [osx], [watch-os], [tvos], [cocoa-touch] und [cocoa] für (sprachunabhängige) Fragen zu den Plattformen oder Frameworks. ___ tag123ipad ___ iPad ist ein von Apple entwickelter Tablet-Computer, auf dem das iOS-Betriebssystem ausgeführt wird. iPad-Anwendungen werden normalerweise in Objective-C oder Swift in der Xcode-IDE geschrieben, obwohl es auch möglich ist, andere Tools zum Erstellen von iPad-Anwendungen zu verwenden. Fragen, die nicht von der Hardware abhängig sind, sollten stattdessen das iOS-Tag verwenden. ___ answer47785041 ___

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%     
___ answer26567396 ___

Dies berücksichtigt mehrere Dezimalstellen, indem Sie mit einem NSScanner testen, ob die neue Zeichenfolge numerisch wäre:

%Vor%     
___
CodeSteger 12.04.2017 13:03
quelle
-1

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%     
user2284969 28.02.2018 22:15
quelle

Tags und Links