oky_sabeni
oky_sabeni

Reputation: 7822

How do I get absolute value of NSCFNumber?

I have a value coming from an API server. The server stores it as BigDecimal on Postgres. On the iOS side, the value is of type __NSCFNumber. How do I get the absolute value for NSCFNumber?

My primary purpose is to further convert this number to a currency.

Upvotes: 1

Views: 3861

Answers (3)

oky_sabeni
oky_sabeni

Reputation: 7822

I asked an incomplete and vague question and I'm sorry. For my sins, I'm posting my solution and maybe it can help someone.

NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler                                  decimalNumberHandlerWithRoundingMode:NSRoundUp
                                       scale:2
                                       raiseOnExactness:NO
                                       raiseOnOverflow:NO
                                       raiseOnUnderflow:NO
                                       raiseOnDivideByZero:YES];

NSDecimalNumber *totalAmount = [NSDecimalNumber decimalNumberWithDecimal:[user[@"total"] decimalValue]];
totalAmount = [[self abs:totalAmount] decimalNumberByRoundingAccordingToBehavior:roundUp];

The helper method that I got from this SO question.

- (NSDecimalNumber *)abs:(NSDecimalNumber *)num {
    if ([num compare:[NSDecimalNumber zero]] == NSOrderedAscending) {
        // Number is negative. Multiply by -1
        NSDecimalNumber * negativeOne = [NSDecimalNumber decimalNumberWithMantissa:1
                                                                          exponent:0
                                                                        isNegative:YES];
        return [num decimalNumberByMultiplyingBy:negativeOne];
    } else {
        return num;
    }
}

Upvotes: 0

picciano
picciano

Reputation: 22701

You have a choice on the precision, but assuming a double value, you can use this:

NSNumber *number = [NSNumber numberWithDouble:-3.14159]; // isa Class   __NSCFNumber    0x0000000101357a20
double absoluteValue = fabsl([number doubleValue]);
NSLog(@"absolute value = %f", absoluteValue);

Outputs:

absolute value = 3.141590

Upvotes: 0

rob mayoff
rob mayoff

Reputation: 385540

__NSCFNumber is an internal class that implements the NSNumber interface.

If you want a double:

NSNumber *myNumber = objectFromPostgres;
double value = fabs(myNumber.doubleValue);

If you want a long:

NSNumber *myNumber = objectFromPostgres;
long value = labs(myNumber.longValue);

If you want an int:

NSNumber *myNumber = objectFromPostgres;
int value = abs(myNumber.intValue);

Upvotes: 7

Related Questions