2010-08-07 99 views
2

更好的辦法考慮下面的代碼到一個NSArray轉換NSString的對NSNumbers

NSString *param_string @"1:3:6:10:15:22:28:30"; 
NSArray *params = [param_string componentsSeparatedByString:@":"]; 

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterNoStyle]; 

NSMutableArray *convertedArray = [[NSMutableArray alloc] initWithCapacity:[params count]]; 

for(int i = 0; i < [params count]; i++){ 
    [convertedArray insertObject:[formatter numberFromString:[params objectAtIndex:i] atIndex:i]]; 
} 

是否有實現這一目標的一個更好的,更有效的方式?在實踐中,初始param_string可能會更長,但我不希望params數組中的元素數量超過200個。

感謝

+0

在輸入字符串和數組中,元素的順序必須相同嗎? – GorillaPatch 2010-08-07 11:06:23

+0

不一定,如果元素的順序得到重新安排它最終不會很重要 – acqu13sce 2010-08-07 11:29:03

回答

7

這個怎麼樣。

添加類別的NSString

@interface NSString(MyConverter) 

-(NSDecimalNumber*) decimalNumberValue; 

@end 

@implementation NSString(MyConverter) 

-(NSDecimalNumber*) decimalNumberValue 
{ 
    return [NSDecimalNumber decimalNumberWithString: self]; 
} 

@end 

現在如果你想一些其他的對象不是NSDecimalNumber,你可以做到這一點

NSString *param_string @"1:3:6:10:15:22:28:30"; 
NSArray *params = [param_string componentsSeparatedByString:@":"]; 

NSArray* decimalNumbers = [params valueForKey: @"decimalNumberValue"]; 

顯然,只是相應地改變你的類別。該方法只需要返回一個可以放入數組的對象。

+0

謝謝,我喜歡這個解決方案,我仍然是一個新鮮的obj-c程序員,並沒有意識到valueForKey方法,我想現在我會更頻繁地使用它。 – acqu13sce 2010-08-08 03:58:45

0

NSString有一個實例方法intValue,可能使這更簡單。

NSNumber *value = [NSNumber numerWithInt:[[params objectAtIndex:i] intValue]]; 

現在將value插入到數組中。如果字符串總是這麼簡單,那麼你真的不是一個數字格式化程序。

+0

感謝您的答案,我使用數字格式化程序,因爲數字可能最終會變得足夠大,以溢出一個int,所以我不能認爲intValue會工作。 – acqu13sce 2010-08-07 11:28:02

+0

那麼還有'doubleValue'和'longValue'方法。 – 2010-08-07 18:07:54

0

您可以使用NSScanner並避免2個循環(一個在componentsSeparatedByString之內,另一個填充可變數組)。

隨着NSScanner你可能會完成你的目標只有一個數組(可變數組)。