确定NSString的第一个字符是否是一个数字

问题描述:

我只是想知道如何确定NSString的第一个字符是否是一个数字。确定NSString的第一个字符是否是一个数字

BOOL hasLeadingNumberInString(NSString* s) { 
if (s) 
    return [s length] && isnumber([s characterAtIndex:0]); 
else 
    return NO; 

}

在吨他一次处理许多NSString事件(如循环数组),并且您希望检查每一个格式(如前导数字),因此最好包含检查以便不尝试评估空字符串或不存在的字符串。

实施例:

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 
+0

我喜欢这个。当意外的零或零长度的字符串出现时,许多应用程序崩溃。开发人员永远不会试图离开这个领域或其他古怪的东西。 – 2011-03-06 00:54:33

+0

NSString * s; hasLeadingNumberInString(s); //返回NO不会起作用,因为s是一个随机数,而不是零。 (次要方法是正确的,只需要使用NSString * s = nil;对于测试。 – 2011-03-06 01:00:03

+0

Tom是正确的。我的方法假定s至少初始化为零或其他。 – Beljoda 2011-03-07 18:36:30

检查返回值:

[myString rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]]; 

如果返回范围的location价值0,你有一个匹配的第一个字符。

+1

这可能是长串很慢,并且如果用户输入stting它可以是任何长度。 (请参见order(N)comment) – 2011-03-06 00:55:40

+0

您是否确实检查过该方法是否扫描整个字符串?如果它真的执行的确很糟糕。从文档:“查找并返回给定字符集中第一个字符的接收器范围。”听起来我喜欢它一旦找到匹配就停下来。 – 2011-03-06 10:02:58

+0

关于它的更多思考,至少如果第一个字符有正面匹配,我上面所说的应该是真实的。如果不是,则字符串确实会被完全解析(在最糟糕的情况下,当整个字符串中没有匹配时)。 – 2011-03-06 10:13:14

是的。你可以这样做:

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

甚至isdigit([s characterAtIndex:0])? – Tommy 2011-03-05 19:30:12

我可以想到两种方法来做到这一点。你可以使用

[string rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]].location == 0 

或者你可以使用

[[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[string characterAtIndex:0]] 
+0

我不会使用这些。他们扫描字符串o(N)。如果你只关心第一个字符,应该使用o(1)解决方案。 – Scott 2011-03-05 19:41:13

+0

第二个不扫描字符串。根据NSCharacterSet的实现方式,它可能会扫描这个集合,或者它可能是一个非常类似于下面的答案的测试。 – Anomie 2011-03-05 19:50:40

+0

也可能是由于decimalDigitCharacterSet引发了一个被分配的自动释放对象,因此被调用很多次会导致性能下降。 – 2011-03-06 00:57:20

而不是使用它可以扫描整个字符串的电话,最好是拉出第一个字符,然后看看它是什么:

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