将NSStrings的NSArray转换为NSNumber的更好方法

时间:2010-08-07 11:01:57

标签: iphone objective-c

考虑以下代码

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个元素。

由于

3 个答案:

答案 0 :(得分:7)

这个怎么样。

向NSString添加类别

@interface NSString(MyConverter)

-(NSDecimalNumber*) decimalNumberValue;

@end

@implementation NSString(MyConverter)

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

@end

现在你可以这样做

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

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

显然,如果你想要一个除NSDecimalNumber之外的其他对象,只需相应地改变你的类别。该方法只需返回一个可以放入数组的对象。

答案 1 :(得分:0)

NSString有一个实例方法intValue可能会让这更直接。

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

现在将value插入数组中。如果字符串总是这么简单,那么你真的不是一个数字格式化器。

答案 2 :(得分:0)

你可以使用NSScanner并避免2个循环(一个在componentsSeparatedByString内,一个填充你的可变数组。)

使用NSScanner,你可以用一个只有一个数组(可变数组)完成你的目标。