Comment valider la saisie d'une chaîne de caractères à partir d'un UITextField ? Je veux vérifier que la chaîne est numérique, y compris les points décimaux.
Réponses
Trop de publicités?Vous pouvez le faire en quelques lignes comme ceci :
BOOL valid;
NSCharacterSet *alphaNums = [NSCharacterSet decimalDigitCharacterSet];
NSCharacterSet *inStringSet = [NSCharacterSet characterSetWithCharactersInString:myInputField.text];
valid = [alphaNums isSupersetOfSet:inStringSet];
if (!valid) // Not numeric
-- ceci est pour valider que les entrées sont des caractères numériques uniquement. Regardez la documentation pour NSCharacterSet
pour les autres options. Vous pouvez utiliser characterSetWithCharactersInString pour spécifier tout ensemble de caractères d'entrée valides.
Il y a plusieurs façons de procéder :
- Utilisez la méthode numberFromString : de NSNumberFormatter. Cette méthode renverra un NSNumber si la chaîne de caractères est analysée correctement ou
nil
si elle ne le peut pas. - Utiliser NSScanner
- Supprimez tout caractère non numérique et voyez si la chaîne de caractères correspond toujours.
- Utiliser une expression régulière
IMO, en utilisant quelque chose comme -[NSString doubleValue]
ne serait pas la meilleure option car les deux @"0.0"
et @"abc"
Les méthodes *value renvoient toutes 0 si elles ne parviennent pas à convertir correctement la chaîne de caractères, il serait donc difficile de faire la distinction entre une chaîne de caractères légitime de type @"0"
et une chaîne non valide. Quelque chose comme le C strtol
aurait le même problème.
Je pense que l'utilisation de NSNumberFormatter serait la meilleure option, puisqu'elle prend en compte les paramètres linguistiques (c'est-à-dire que le numéro de l'article est le même que celui de l'article). @"1,23"
en Europe, contre @"1.23"
aux États-Unis).
J'utilise ce code dans mon application Mac, le même ou un code similaire devrait fonctionner avec l'iPhone. Il est basé sur les expressions régulières de RegexKitLite et rend le texte rouge quand il est invalide.
static bool TextIsValidValue( NSString* newText, double &value )
{
bool result = false;
if ( [newText isMatchedByRegex:@"^(?:|0|[1-9]\\d*)(?:\\.\\d*)?$"] ) {
result = true;
value = [newText doubleValue];
}
return result;
}
- (IBAction) doTextChanged:(id)sender;
{
double value;
if ( TextIsValidValue( [i_pause stringValue], value ) ) {
[i_pause setTextColor:[NSColor blackColor]];
// do something with the value
} else {
[i_pause setTextColor:[NSColor redColor]];
}
}
Si vous souhaitez que l'utilisateur ne soit autorisé à saisir que des chiffres, vous pouvez faire en sorte que votre ViewController mette en œuvre une partie de UITextFieldDelegate et définir cette méthode :
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSString *resultingString = [textField.text stringByReplacingCharactersInRange: range withString: string];
// The user deleting all input is perfectly acceptable.
if ([resultingString length] == 0) {
return true;
}
NSInteger holder;
NSScanner *scan = [NSScanner scannerWithString: resultingString];
return [scan scanInteger: &holder] && [scan isAtEnd];
}
Il y a probablement des moyens plus efficaces, mais je trouve que c'est un moyen assez pratique façon. Et la méthode devrait être facilement adaptable à la validation de doubles ou autres : il suffit d'utiliser scanDouble : ou similaire.
#pragma mark - UItextfield Delegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if ([string isEqualToString:@"("]||[string isEqualToString:@")"]) {
return TRUE;
}
NSLog(@"Range ==%d ,%d",range.length,range.location);
//NSRange *CURRANGE = [NSString rangeOfString:string];
if (range.location == 0 && range.length == 0) {
if ([string isEqualToString:@"+"]) {
return TRUE;
}
}
return [self isNumeric:string];
}
-(BOOL)isNumeric:(NSString*)inputString{
BOOL isValid = NO;
NSCharacterSet *alphaNumbersSet = [NSCharacterSet decimalDigitCharacterSet];
NSCharacterSet *stringSet = [NSCharacterSet characterSetWithCharactersInString:inputString];
isValid = [alphaNumbersSet isSupersetOfSet:stringSet];
return isValid;
}