2011-03-05 345 views

回答

20
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

5

檢查返回值:

[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

8

是的。你可以這樣做:

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

7

我可以想到兩種方法來做到這一點。你可以使用

[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

4

而不是使用它可以掃描整個字符串的電話,最好是拉出第一個字符,然後看看它是什麼:

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