94 votes

Savoir si une chaîne est numérique ou non

Comment pouvons-nous vérifier si une chaîne est composée uniquement de nombres. Je sors une sous-chaîne d'une chaîne et je veux vérifier s'il s'agit d'une sous-chaîne numérique ou non.

 NSString *newString = [myString substringWithRange:NSMakeRange(2,3)];
 

245voto

John Calsbeek Points 19381

Voici une façon qui ne repose pas sur la précision limitée de tenter d'analyser la chaîne comme un nombre:

NSCharacterSet* notDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
if ([newString rangeOfCharacterFromSet:notDigits].location == NSNotFound)
{
    // newString consists only of the digits 0 through 9
}

Voir +[NSCharacterSet decimalDigitCharacterSet] et -[NSString rangeOfCharacterFromSet:].

34voto

samsymons Points 358

Je suggérerais d'utiliser la méthode numberFromString: de la classe NSNumberFormatter , comme si le nombre n'était pas valide, il renverrait nil; sinon, il vous retournera un NSNumber.

 NSNumberFormatter *nf = [[[NSNumberFormatter alloc] init] autorelease];
BOOL isDecimal = [nf numberFromString:newString] != nil;
 

9voto

Regexident Points 17722

Vous pouvez créer un scanner NSS et numériser simplement la chaîne:

 NSDecimal decimalValue;
NSScanner *sc = [NSScanner scannerWithString:newString];
[sc scanDecimal:&decimalValue];
BOOL isDecimal = [sc isAtEnd];
 

Consultez la documentation de NSScanner pour plus de méthodes.

7voto

Tommy Points 56749

Je pense que le moyen le plus simple de vérifier que chaque caractère d'une chaîne donnée est numérique est probablement:

 NSString *trimmedString = [newString stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]];

if([trimmedString length])
{
    NSLog(@"some characters outside of the decimal character set found");
}
else
{
    NSLog(@"all characters were in the decimal character set");
}
 

Utilisez l’une des autres méthodes de fabrique NSCharacterSet si vous souhaitez un contrôle complet sur les caractères acceptables.

4voto

MrTristan Points 334

pour être clair, cela fonctionne pour les entiers dans les chaînes.

Heres une petite catégorie d'aide basée sur la réponse de John ci-dessus:

dans le fichier .h

 @interface NSString (NumberChecking)

+(bool)isNumber:(NSString *)string;

@end
 

dans le fichier .m

 #import "NSString+NumberChecking.h"

@implementation NSString (NumberChecking)

+(bool)isNumber {
    if([self rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]].location == NSNotFound) {
        return YES;
    }else {
        return NO;
    }
}

@end
 

usage:

 #import "NSString+NumberChecking.h"

if([someString isNumber]) {
    NSLog(@"is a number");
}else {
    NSLog(@"not a number");
}
 

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