Ky -
Ky -

Reputation: 32073

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

Upvotes: 1

Views: 94

Answers (2)

Terry Wilcox
Terry Wilcox

Reputation: 9040

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.

Upvotes: 1

trojanfoe
trojanfoe

Reputation: 122381

Use [NSDecimalNumber decimalNumberWithString:], like this:

NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"123.456"];

The number of decimal places only affects the string representation of the number; once the number is stored in an NSDecimalNumber object it can be formatted back to a string in any way you desire.

Upvotes: 1

Related Questions