【问题标题】:Better way to convert an NSArray of NSStrings to NSNumbers将 NSString 的 NSArray 转换为 NSNumber 的更好方法
【发布时间】:2010-08-07 11:01:57
【问题描述】:

考虑下面的代码

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

谢谢

【问题讨论】:

  • 输入字符串和数组中元素的顺序是否必须一致?
  • 不一定,如果元素的顺序被重新排列,最终也没关系

标签: iphone objective-c


【解决方案1】:

这个怎么样。

为 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 以外的其他对象,只需相应地更改您的类别即可。该方法只需要返回一个可以放入数组中的对象。

【讨论】:

  • 谢谢,我喜欢这个解决方案,我还是个新手 obj-c 程序员,不知道 valueForKey 方法,我想我现在会更频繁地使用它。
【解决方案2】:

NSString 有一个实例方法 intValue,这可能会使这更简单。

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

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

【讨论】:

  • 感谢您的回答,我正在使用数字格式化程序,因为数字最终可能会大到足以溢出 int,所以我不能假设 intValue 会起作用。
  • 还有doubleValuelongValue 方法。
【解决方案3】:

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

使用NSScanner,您可以通过一个数组(可变的数字数组)来实现您的目标。

【讨论】:

    猜你喜欢
    • 2015-09-11
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2011-04-27
    • 2010-11-29
    相关资源
    最近更新 更多