【发布时间】:2015-03-26 02:06:24
【问题描述】:
我有一个来自 API 服务器的值。服务器将它作为 BigDecimal 存储在 Postgres 上。在 iOS 端,该值为__NSCFNumber 类型。如何获得NSCFNumber 的绝对值?
我的主要目的是进一步将此数字转换为货币。
【问题讨论】:
-
这是
NSNumber的内部表示。显示一些有关如何获得此号码的代码。
标签: ios objective-c
我有一个来自 API 服务器的值。服务器将它作为 BigDecimal 存储在 Postgres 上。在 iOS 端,该值为__NSCFNumber 类型。如何获得NSCFNumber 的绝对值?
我的主要目的是进一步将此数字转换为货币。
【问题讨论】:
NSNumber 的内部表示。显示一些有关如何获得此号码的代码。
标签: ios objective-c
__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);
【讨论】:
您可以选择精度,但假设是双精度值,您可以使用:
NSNumber *number = [NSNumber numberWithDouble:-3.14159]; // isa Class __NSCFNumber 0x0000000101357a20
double absoluteValue = fabsl([number doubleValue]);
NSLog(@"absolute value = %f", absoluteValue);
输出:
absolute value = 3.141590
【讨论】:
我问了一个不完整且含糊不清的问题,很抱歉。对于我的罪过,我正在发布我的解决方案,也许它可以帮助某人。
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;
}
}
【讨论】: