我如何获得NSCFNumber的绝对值?

时间:2015-03-26 02:06:24

标签: ios objective-c

我有来自API服务器的值。服务器将它作为BigDecimal存储在Postgres上。在iOS端,值为__NSCFNumber类型。如何获得NSCFNumber的绝对值?

我的主要目的是进一步将此数字转换为货币。

3 个答案:

答案 0 :(得分:7)

__NSCFNumber是一个实现NSNumber接口的内部类。

如果您想要double

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

如果您想要long

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

如果您想要int

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

答案 1 :(得分:0)

您可以选择精度,但假设为double值,您可以使用:

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

输出:

absolute value = 3.141590

答案 2 :(得分:0)

我问了一个不完整和含糊的问题,我很抱歉。对于我的罪过,我正在发布我的解决方案,也许它可以帮助别人。

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

我从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;
    }
}