我已经在Objective C中得到了这个循环,需要一些指导才能解决问题。我试图根据数组,数组中存储为字符串的数字来计算四个条的高度。 largestTotal是一个字符串,包含数组中四个对象中最大的一个。我以前将数组中的每个元素格式化为货币。
for (int j=0; j<[array count]; j++) {
NSLog(@"%@ %@ %@",[NSString stringWithFormat:@"%d", j], [array objectAtIndex:j], biggestTotal);
double barHeight = (([[array objectAtIndex:j] doubleValue])*400.0/([biggestTotal doubleValue]));
NSLog(@"%@",barHeight);
CGRect currentRect = CGRectMake((150.0+(j*125.0)), (425.0-barHeight), 100.0, barHeight); // (x, y, width, height)
CGContextAddRect(context, currentRect);
CGContextDrawPath(context, kCGPathFillStroke);
}
使用上面的NSLog语句,我得到如下控制台输出:
0 $106,758.20 $106,758.20
(null)
1 $14,536.69 $106,758.20
(null)
2 $32,111.96 $106,758.20
(null)
3 $100,020.00 $106,758.20
(null)
另外,遗憾的是我没有酒吧。我在这里错过了什么?为什么barHeight是(null)?任何帮助都将非常感激......
答案 0 :(得分:6)
barHeight
为NULL
*,因为@"$106,758.20"
没有有效的doubleValue
。摆脱$
和,
**,它应该有效。
另外,如果您使用货币进行数学运算,don't use double
。使用NSDecimalNumber
*实际上0.0
因为它无法转换per the docs,但是,正如其他人所指出的那样,你试图用错误的格式说明符来记录它:{{1 },用于对象,而不是%@
。由于double
为0x0
和nil
:),如果您尝试0x0 == 0.0
,则输出为“(null)”。 同样,如果您 从NSLog(@"%@", 0.0);
获得有效回报,您尝试使用doubleValue
很可能会导致崩溃**,因为你将试图触摸你不应该的记忆。
**感谢Caleb(见评论)指出这一点。
答案 1 :(得分:1)
NSLog(@"%@ %@ %@",[NSString stringWithFormat:@"%d", j], [array objectAtIndex:j], biggestTotal);
你不需要[NSString stringWithFormat...]
位... NSLog会为你做这件事。这样做:
NSLog(@"%@ %f", [array objectAtIndex:j], biggestTotal);
另外,请注意我使用%f而不是%@作为第二个格式说明符。这是因为largestTotal是double,而不是对象指针。 %@说明符仅用于对象。您将希望在第二个NSLog()语句中进行相同的更改。
编辑:我现在看到你说bigTotal是一个字符串,在这种情况下%@是正确的。但是,第二个NSLog()为barHeight指定%@,其中 为double,因此您仍需要修复它。你的第一个日志语句是为maximumTotal打印(null),所以我怀疑你在创建maximumTotal时遇到了一些问题。
答案 2 :(得分:1)
据我所知%@
仅用于对象,当我在原始数据类型上意外使用它时,我只有问题。我只是试了一下它,它为我坠毁了。相反,我使用(双打):
NSLog(@"%lf", barHeight);
可在此处找到综合列表: