2010-04-13 4 views
1

J'ai remarqué que le système d'exploitation de l'iPhone est assez bon pour choisir des valeurs entières lorsqu'on lui demande. Plus précisément, si vous utiliseziPhone/iPad: recherche de caractères non valides dans une zone de texte pour les entiers uniquement

NSString *stringName = @"6("; 
int number = [stringName intValue]; 

l'iPhone OS choisira le 6 et tournez le nombre variable en 6. Cependant, dans mistypes plus complexes, ce qui rend également la variable int 6:

NSString *stringName = @"6(5"; 
int number = [stringName intValue]; 

L'OS de l'iPhone manque l'autre chiffre, alors que ce qui aurait pu être l'utilisateur essayant d'entrer le numéro 65, le système d'exploitation n'en obtient que le numéro 6. J'ai besoin d'une solution pour vérifier une chaîne pour les caractères non valides et retourner NO s'il y a autre chose qu'un entier non signé dans une zone de texte. C'est pour iPad, et actuellement il n'y a pas de clavier numérique comme l'iPhone a, et je suis limité à la place au clavier 123 standard. Je pensais que je devais utiliser NSRange et en quelque sorte faire une boucle sur la chaîne entière dans la zone de texte, et vérifier pour voir si le caractère courant dans l'itération est un nombre. Je suis perdu pour autant. Je peux penser à le tester contre zéro, mais zéro est un entier valide.

Quelqu'un peut-il aider?

+1

zéro est un entier valide, mais il est aussi interdit par les récentes révisions de l'accord de développement d'Apple. Tout comme les zones de texte. : P – izb

Répondre

3

Mettre en oeuvre la mention méthode UITextFieldDelegate NSResponder, et vérifier la chaîne de remplacement avec la méthode NSString-rangeOfCharacterFromSet: , comme ceci:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)newString 
{ 
    // create a character set containing everything except the decimal digits 
    // (you might want to cache this, as inverting the set probably isn't fast) 
    NSCharacterSet *nonNumericCharacters = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; 
    // and check whether there's a character in the string that's not in that set 
    if([newString rangeOfCharacterFromSet:nonNumericCharacters].location != NSNotFound) 
     return NO; 
    return YES; 
} 
+1

Ou, mieux encore, dites à un formateur de nombres de tenter d'analyser la chaîne. Cela gérera les nombres négatifs, les points décimaux et les changements de paramètres régionaux (par exemple, différents points décimaux). –

+1

Cela peut entraîner un problème lorsque l'utilisateur appuie sur le retour arrière. –

0

Je voudrais juste que le délégué UITextField veto toute tentative d'insérer des caractères non numériques. Voir -textField:shouldChangeCharactersInRange:replacementString:

1

Vous voulez probablement utiliser un NSScanner

Avec le NSScanner, vous pouvez le faire -scanInt:, puis vérifier -isAtEnd

+0

C'est une bonne idée. – Jann

0
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
    { 

      if([string isEqualToString:@"\b"] || [string isEqualToString:@"0"] || [string isEqualToString:@"1"] ||[string isEqualToString:@"2"] || [string isEqualToString:@"3"] || [string isEqualToString:@"4"] || [string isEqualToString:@"5"] || [string isEqualToString:@"6"] || [string isEqualToString:@"7"] || [string isEqualToString:@"8"] || [string isEqualToString:@"9"] || [string isEqualToString:@"."]) 
      { 
       return YES; 
      } 
      else{ 
       return NO; 
      } 
} 

Espérons que cela aide.

Merci,

Madhup

+1

Je ne pense pas qu'il soit nécessaire de vérifier le caractère de retour arrière-il n'est pas entré comme tel, vous obtenez juste une chaîne vide qui remplace n'importe quel caractère juste avant le signe d'insertion. –

Questions connexes