Search code examples
iphoneobjective-cnsdecimalnumber

NSNumberFormatter and rounding percentage value


here is my code snip, i dont know how to round double numbers.

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

here tmpProduct.msrp and mpProduct.discountPrice are (NSDecimalNUmber *)

from the operation above I got p = 44.995757

i want to convert it to (45%) , how do i do that?

here is what i use , but that does not help.

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

Solution

  • Have you tried using the arithmetic operations NSDecimalNumber provides?
    I haven't tried that myself, but it seems you are bypassing the advantages of NSDecimalNumber by using standard operators ( *, /, ...) on the double values of your number instances.
    Take a look at NSDecimalNumber: Performing Arithmetic

    As Objective-C does not support operator overloading you will have to use methods such as:

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

    Update:
    Division using NSDecimalNumber:

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

    by using descriptionWithLocale: , you get the correct NSLocaleDecimalSeparator

    Update 2:
    I forgot about the rounding:
    NSDecimalNumber supports several rounding modes.
    Read the documentation of decimalNumberByRoundingAccordingToBehavior: