NSArray更改NSNumber的类型

时间:2015-06-20 14:21:40

标签: ios objective-c

我想在NSArray中将一些NSNumber存储为double。所以我试过了:

NSArray *diamArray = [[NSArray alloc] initWithObjects:
                     [NSNumber numberWithDouble:1.0],
                     [NSNumber numberWithDouble:1.2],
                     nil];

然后,我要求Xcode显示diamArray:

NSLog(@"%@", diamArray);

结果如下:

[8873:1153347] (
    1,
    "1.2"
)

所以我们可以看到这两个数字的处理方式不同。这对我来说是个问题,因为这些值可用作类型更改。特别是,在数组的调试监视中,我可以看到十进制数(1.2)为“double”,但1.0值显示为“null”。

如何强制数组将1.0视为double?

3 个答案:

答案 0 :(得分:6)

在尝试显示方便信息时,从NSLog解密数据类型可能会造成混淆。在这种情况下,1.0正好是一个,因此它会截断该值,使其看起来像是一个Int。我几乎可以保证,如果您将项目从数组中拉出并显示它的对象,您会发现它是双重的:

$sql = "INSERT INTO stackoverflowplaceholder (".implode("','",$stacks)."  ) VALUES (";

要考虑的另一件事是,值可以来自NSNumber,因此即使它将1.0存储为整数值,您仍然可以将其提取为double:

NSLog("%@: %s", diamArray[0], [diamArray[0] objCType]);

答案 1 :(得分:2)

NSNumber是类群。您不应该担心它如何存储信息,但您应该主要关心如何检索这些信息。

要取回 double ,您只需执行以下操作:

double myDouble = [dimArray[0] doubleValue];

但也有:

[dimArray[0] intValue];
[dimArray[0] integerValue];
[dimArray[0] unsignedIntegerValue];
[dimArray[0] floatValue];
...

答案 2 :(得分:0)

感谢您提供的信息和建议。

我发现它与语言环境有关。我的默认语言环境是fr_FR,然后我尝试了:

NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
f.numberStyle = NSNumberFormatterDecimalStyle;
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[f setLocale:usLocale];
 NSArray *pasArray = [[NSArray alloc] initWithObjects:
                     [f numberFromString:[[NSNumber numberWithDouble:1.0] stringValue]],
                     [f numberFromString:[[NSNumber numberWithDouble:0.25] stringValue]],
nil];

它按预期工作。我想,由于区域设置不同,点被误解了。但我认为这样做并不是很干净。

我的结论是David Berry是对的:我不必关心显示器,而是在需要时询问我需要的格式。

再次感谢您帮助我理解为什么它不是问题。