Reputation: 7822
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
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
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
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