2017-05-15 1 views
0

En essayant de prendre du poids de l'utilisateur dans un UITextField. Lorsque la valeur peut être quelque chose comme çaComment créer une regex pour une valeur flottante optionnelle dans UITextField?

9,56

50,75

Actuellement, j'ai essayé cela et ne fonctionne pas.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
     let Regex = "([0-9]){0,2}\\.([0-9]){0,2}" 
     let TestResult = NSPredicate.init(format:"SELF MATCHES %@",Regex) 
     return TestResult.evaluate(with: textField.text! + string) 
    } 

Il retourne toujours faux.

123456,123456 devrait être faux

12,12 doit être vrai

+0

Essayez-vous d'extraire toutes ces valeurs? Ou les validez-vous en tant que chaînes séparées? Votre code actuel vérifie juste si une chaîne correspond entièrement à votre modèle ('MATCHES' nécessite une correspondance de chaîne complète). –

+0

Essayez '" [0-9] {0,2} (?: [.] [0-9] {1,2})? "' Juste au cas où. Cela correspondra également à une chaîne vide. –

+0

@nirav D Je l'ai essayé et ne fonctionne pas. –

Répondre

0

Utilisez cette option si vous voulez faire correspondre uniquement ces formats:

.1 
.12 
1 
1. 
1.1 
1.12 
12 
12. 
12.1 
12.12 

^(?:\d{1,2}(?:\.\d{0,2})?|\.\d{1,2})$

ne correspond pas à une chaîne vide.

Expliqué

^       # BOS 
(?:       # -------------- 
     \d{1,2}      # one or two digits 
     (?: \. \d{0,2})?    # optional '.' and 0 to 2 digits 
    |        # or, 
     \. \d{1,2}     # '.' and 1 or 2 digits 
)        # -------------- 
$        # EOS 

Remarque - Toujours utiliser des ancres comme il en fait une solution autonome portable !!
En outre, pour référence ce (?:\d+(?:\.\d*)?|\.\d+) est la norme de base pour l'analyse du langage d'un nombre (sans décoration).

0

Vous pouvez utiliser celui-ci: ^\d{1,2}(?:[.,]\d{1,2})?$

Demo

Explication

^ Du début de la ligne,

\d{1,2} en jeu un certain nombre de chiffres compris entre 1 à 2 fois

(?:[.,]\d{1,2})? avec en option 1 ou 2 décimales (?: est un groupe non de capture)

$ jusqu'à la fin de la ligne

+0

Merci d'avoir répondu. Mais je veux limiter à 2 caractères avant "." et 2 caractères après "." –

+0

Vous n'avez besoin d'aucune ancre. Le motif est ancré par défaut. –

+0

Réponse modifiée pour répondre à vos besoins –

0

essayer celui-ci

[0-9] {2,2}? ([.] [0-9] {2,2}?)?