将NSStrings数组转换为格式化NSNumbers数组

时间:2013-02-28 16:03:18

标签: objective-c nsarray nsnumber nsnumberformatter

我有一个名为valuesArray的字符串数组,其中包含如下值:2913451.0938

我正在尝试格式化这些数字,以便我可以像这样显示它们:2,913,451.09

使用以下代码,我能够从数组中读取值并将它们转换为NSNumbers(num),我还可以创建一个格式化程序来定义我希望如何显示数字( formatter)。

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMaximumFractionDigits:2];

NSNumber *num = valuesArray[indexPath.row];
NSLog(@"num: %@",num);
NSLog(@"Formatter: %@",formatter);
NSString *forNum = [formatter stringFromNumber:num];
NSLog(@"FormattedNum: %@",forNum);

当我运行代码并到达NSLog(@"FormattedNum: %@",forNum);行时,我看到它打印null。我错过了什么?

2 个答案:

答案 0 :(得分:1)

代码中的问题是您从字符串数组valueArray中检索元素,但将其分配给NSNumber类型的变量 - 而对象确实是NSString。当你将它传递给格式化程序时,它返回nil(即使它也可能崩溃,它只是未定义的行为)。

您必须将字符串转换为NSNumber

NSNumber *num = @([valuesArray[indexPath.row] doubleValue]);

答案 1 :(得分:0)

我刚用这个值检查了这段代码:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMaximumFractionDigits:2];

NSNumber *num = @(2913451.0938);

NSLog(@"num: %@",num);
NSLog(@"Formatter: %@",formatter);
NSString *forNum = [formatter stringFromNumber:num];
NSLog(@"FormattedNum: %@",forNum);

它工作正常,没有任何错误,就像你提到的那样。

参见输出:

2013-02-28 21:35:44.417 BrowserModal[4861:403] num: 2913451.0938
2013-02-28 21:35:44.418 BrowserModal[4861:403] Formatter: <NSNumberFormatter: 0x100160840>
2013-02-28 21:35:44.419 BrowserModal[4861:403] FormattedNum: 29,13,451.09

请清理目标并重新构建。

确保valuesArray[indexPath.row]返回一个装箱的NSNumber对象。

执行:@([valuesArray [indexPath.row] doubleValue]);