2015-06-20 44 views
3

我想在NSArray中存储一些NSNumber作为double。所以,我想的是:NSArray更改类型的NSNumber

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?

+4

这只是一个日志。你怎么实际使用数组中存在问题的值? – Wain

回答

6

它可能会混淆从NSLog解密数据类型,因为它试图显示方便的信息。在这种情况下,1.0正好是1,所以它将截断该值,使其看起来像是一个Int。我几乎保证了,如果你要拉项目从数组中,并显示它的objCType你会发现,这是一个双:

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

其他的事情要考虑的是该值可以转换现身的NSNumber的,因此即使它存储1.0为整数值,仍可以将其解压缩为双:

[diamArray[0] doubleValue] 
2

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

要拿回你的,你刚才做的事:

double myDouble = [dimArray[0] doubleValue]; 

但也有:

[dimArray[0] intValue]; 
[dimArray[0] integerValue]; 
[dimArray[0] unsignedIntegerValue]; 
[dimArray[0] floatValue]; 
... 
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]; 

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

我的结论是,大卫贝瑞是正确的:我不必关心显示器,而是要求我需要时的格式。

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

相关问题