Search code examples
objective-cnsstringtype-conversionnsdecimalnumber

What's the intended way to turn a NSString into a NSDecimalNumber with two decimal places?


I'm currently using the following methodology to turn a NSString number (like @"123.456") into a NSDecimalNumber after rounding (like 123.46), but it feels hacky. Is there a more intended solution?

+ (NSDecimalNumber*)decimalNumberForString:(NSString*)str accuracy:(NSUInteger)accuracy
{
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    formatter.numberStyle = NSNumberFormatterNoStyle;
    formatter.maximumFractionDigits = accuracy;
    formatter.roundingMode = NSNumberFormatterRoundHalfUp;
    NSNumber *numberVersion = [formatter numberFromString:str];
    return [[NSDecimalNumber alloc] initWithDecimal:numberVersion.decimalValue];
}

Solution

  • Take a look at NSDecimalNumberHandler and NSDecimalNumber's

    -decimalNumberByRoundingAccordingToBehavior:

    method.

    You can create a NSDecimalNumber with your unedited string, then create a new NSDecimal number that's rounded according to the rules you set on NSDecimalNumberHandler.

    There's no need to edit your input string.