NSNumberFormatter和舍入百分比值

时间:2009-12-28 21:07:26

标签: iphone objective-c nsdecimalnumber

这是我的代码片段,我不知道如何舍入双数字。

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]]

2 个答案:

答案 0 :(得分:1)

您是否尝试过使用NSDecimalNumber提供的算术运算?
我自己没有尝试过,但似乎你通过在数字实例的双值上使用标准运算符(*,/,...)来绕过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:

的文档

答案 1 :(得分: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%”。