82 votes

iPhone comment vérifier qu'une chaîne de caractères est uniquement numérique

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.

115voto

Donal O'Danachair Points 1028

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.

72voto

Dave DeLong Points 156978

Il y a plusieurs façons de procéder :

  1. 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.
  2. Utiliser NSScanner
  3. Supprimez tout caractère non numérique et voyez si la chaîne de caractères correspond toujours.
  4. 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).

34voto

Peter N Lewis Points 12025

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]];
    }
}

19voto

Frank Shearar Points 12481

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.

13voto

kalpesh jetani Points 326
#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;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X