我想在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?
答案 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是对的:我不必关心显示器,而是在需要时询问我需要的格式。
再次感谢您帮助我理解为什么它不是问题。