2010-04-24 9 views
0

Quelle est la meilleure façon d'assurer que l'utilisateur est entré dans une chaîne de temps valide comme:Assurez-vous que l'utilisateur a entré une chaîne au format correct?

5:24 5,4

102: 30 102,5

Il sera entré dans un UITextField sera donc être dans un NSString.

Je souhaite autoriser l'utilisateur à entrer l'heure en heures et en minutes (hh: mm) ou en heures et en minutes décimales (hh.m).

Dans l'exemple des heures minutes, ils devraient être en mesure d'entrer autant d'heures que l'équivalent mais seulement entre 0 et 59 minutes. Avec les heures minutes décimales je veux qu'ils soient seulement en mesure d'entrer à nouveau autant d'heures que les minutes comme mais décimales ne peut être 0 - 9.

Merci beaucoup

Répondre

1

Si vous utilisez le dernier SDK non bêta (3.2), vous pouvez utiliser regular expressions pour cela.

NSString *myString = @"5:24"; 
NSString *myRegex = @"^\\d+(?:[:](?:[0-5]?\\d)|\\.\\d)$"; 
NSRange myRange = [myString rangeOfString:myRegex options:NSRegularExpressionSearch]; 
if (myRange.location != NSNotFound) 
    // the string is valid 
else 
    // the string is invalid 

Correspondances:

5:12 
5:1 
5:01 
5:0 
5:00 
1234567:12 
0:0 
5.1 
5.0 
0.1 
0.0 
1234567.1 

Non-matches:

5  // symbol required (i.e. ":" or ".") 
5: // minutes are required 
5:123 // too many minutes, max is 2 digits 
5:67 // minutes can only be up to 59 
-5:12 // negative numbers aren't allowed 
5. // minutes are required 
5.12 // too many minutes, max is 1 digit 
:12 // hours are required 
.12 // hours are required 
5.1a // string must not contain "a" 
5.1 // string must not contain whitespace " " 
+0

Cela semble très bien, mais malheureusement, c'est pour l'iPhone ainsi de suite 3.1.3 –

1

Comme j'utilise 3.1.3, je fait une recherche rapide dans la documentation d'utilisation d'expressions régulières avec des chaînes et je suis venu avec cela, j'ai juste copié ce qui était dans la documentation, mais ajouté aigles regex mais j'ai ajouté une charge de \\ comme ce qu'ils avaient fait dans les docs et il semble fonctionner mais comme je n'ai aucune connaissance de l'expre régulière ssions Je ne sais pas si cela est correct et si elle devrait fonctionner, s'il vous plaît conseille (En attendant, je vais commencer à lire sur des expressions régulières):

NSArray *array = [NSArray arrayWithObjects: @"5:24", @"5.4", @"e3:32", @"1023:90", @"3432.2", nil]; 
NSPredicate *timePred = [NSPredicate predicateWithFormat:@"SELF MATCHES '^\\\\d+(?:[:](?:[0-5]?\\\\d)|\\\\.\\\\d)$'"]; 
NSArray *filteredArray = [array filteredArrayUsingPredicate:timePred]; 

for (NSString *oneString in filteredArray) { 
    NSLog(@"%@", oneString); 
} 
1

Pourquoi ne pas simplement créer un objet de format de date et voir si il renvoie un NSDate valide?

+0

Paul, merci pour la réponse, mais je ne crois pas que NSDate acceptera des heures supérieures à 23 par exemple. si je voulais mettre 102: 32. S'il vous plait corrigez moi si je me trompe! –

+0

Je serais tenté de dire créer une sous-classe personnalisée de NSFormatter, mais dans ce cas, je soupçonne que la solution regex est la voie à suivre. –

+0

Merci pour le conseil :-) –

Questions connexes