2009-12-28 67 views
2

这里是我的代码片段,我不知道如何舍入双数。NSNumberFormatter和舍入百分比值

double m = [tmpProduct.msrp doubleValue] ; 
double d = [tmpProduct.discountPrice doubleValue]; 
double p = (d * 100)/m; 

这里tmpProduct.msrp和mpProduct.discountPrice是(NSDecimalNUmber *)

从操作上面我P = 44.995757

我想将它转化成(45%),怎么办我那样做?

这里是我使用,但没有帮助。

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setMaximumFractionDigits:2]; 
[formatter setRoundingMode: NSNumberFormatterRoundDown]; 
[formatter stringFromNumber:[NSNumber numberWithDouble:p]] 

回答

1

您是否尝试过使用NSDecimalNumber提供的算术运算?
我还没有尝试过自己,但它似乎是通过使用标准运算符(*,/,...)在数字实例的double值上绕过NSDecimalNumber的优点。
看看NSDecimalNumber: Performing Arithmetic

由于Objective-C中不支持运算符重载,你将不得不使用的方法,如:

- (NSDecimalNumber *)decimalNumberByDividingBy:(NSDecimalNumber *)decimalNumber 

更新:
司使用NSDecimalNumber:

NSDecimalNumber* operandOne = [NSDecimalNumber decimalNumberWithString:@"1234.5"]; 
NSDecimalNumber* operandTwo = [NSDecimalNumber decimalNumberWithString:@"2335"]; 
NSDecimalNumber* result = [operandOne decimalNumberByDividingBy:operandTwo]; 
NSLog(@"%@", [result descriptionWithLocale:[NSLocale currentLocale]]); 

通过使用descriptionWithLocale:,你得到正确的NSLocaleDecimalSeparator

更新2:
我忘了取整:
NSDecimalNumber支持几种舍入模式。
阅读的decimalNumberByRoundingAccordingToBehavior:

+0

thanks for reply.i试过这个 NSDecimalNumber * d1 = [tmpProduct.discountPrice decimalNumberByDividingBy:tmpProduct.msrp]; 但这给我例外(这里是价值我得到discounprice = 1234.5和masrp是2335) – Nnp 2009-12-28 21:37:54

+0

没有运气与此? – Nnp 2009-12-28 23:52:25

+0

我用一个小例子更新了我的答案,它使用了您粘贴的值。在这里工作很好。也许你可以发布更多细节?你使用核心数据/绑定等...? – 2009-12-29 09:39:54

1

的文档在这种特殊情况下,我建议设置风格NSNumberFormatterPercentStyle和最大小数位数为0,然后你不应该担心的舍入。这适用于我:

double p = d/m; // note: not multiplying by 100 here 

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterPercentStyle]; 
NSString *s = [formatter stringFromNumber:[NSNumber numberWithDouble:p]]; 

这给出字符串“45%”。