6
votes

Déterminer si le premier caractère de Nstring est un nombre

Je voulais juste savoir comment je peux déterminer si un premier caractère Nstrings est un nombre.


0 commentaires

5 Réponses :


5
votes

vérifier la valeur de retour de: xxx

si l'emplacement de la plage renvoyée est 0 , vous avez une correspondance à le premier caractère.


3 commentaires

Cela pourrait être vraiment lent pour de longues chaînes et si l'utilisateur entrait le paramètre, cela pourrait être n'importe quelle longueur. (Voir ordre (n) Commentaire)


Avez-vous réellement vérifié que la méthode scanne la chaîne entière? Ce serait vraiment mal mis en œuvre s'il l'a fait. De la documentation: "trouve et retourne la plage dans le récepteur du premier caractère à partir d'un jeu de caractères donné." Il me semble que ça aime qu'il s'arrête une fois qu'il a trouvé un match.


En pensant plus à ce sujet, ce que j'ai dit ci-dessus devrait être vrai au moins s'il y a une correspondance positive sur le premier personnage. Sinon, la chaîne sera effectivement analysée complètement (dans le pire des cas lorsqu'il n'y a pas de match dans toute la chaîne).



8
votes

Oui. Vous pouvez faire:

NSString *s = ...; // a string
unichar c = [s characterAtIndex:0];
if (c >= '0' && c <= '9') {
    // you have a number!
}


1 commentaires

Ou même isdigit ([S Caractatindex: 0])?



7
votes

Je peux penser à deux façons de le faire. Vous pouvez utiliser xxx

ou vous pouvez utiliser xxx


3 commentaires

Je n'utiliserais aucun de ces deux. Ils scannent la chaîne O (n). Si vous vous souciez que du premier caractère, une solution O (1) doit être utilisée.


La seconde ne change pas la chaîne. En fonction de la manière dont NSCharacterSet est implémentée, il pourrait analyser l'ensemble ou peut être un test très telle que votre réponse ci-dessous.


Il est également possible que le décimaldigitcharactSetSet jette un objet d'autorélement allocé sur lequel, lorsque cela s'appelle beaucoup de fois, tuera des performances.



4
votes

Plutôt que d'utiliser un appel qui analyse la chaîne entière, il est préférable de tirer le premier caractère, puis de voir ce qu'il est:

char test = [myString characterAtIndex:0];
if (test >= '0' && test <= '9')
  return YES
else
  return NO


0 commentaires

21
votes
NSString* s = nil; //Edit: s needs to be initialized, at the very least, to nil.
hasLeadingNumberInString(s);          //returns NO
hasLeadingNumberInString(@"");        //returns NO
hasLeadingNumberInString(@"0123abc"); //returns YES

3 commentaires

J'aime celui la. Beaucoup d'applications s'écrasent lorsqu'une chaîne de longueur nulle ou zéro inattendue. Les développeurs n'essayent jamais de quitter le champ vide ou d'autres bizarreries.


Nsstring * s; hasleadingnumberinstring (s); // retourne non ne fonctionnera pas, comme s est un nombre aléatoire, pas nulle. (Point mineur La méthode est juste, utilisez simplement Nstring * s = nil; pour le test.


Tom est correct. Ma méthode suppose que S est, à tout le moins, initialiser à nil ou autre chose.