【问题标题】:How do I get absolute value of NSCFNumber?如何获得 NSCFNumber 的绝对值?
【发布时间】:2015-03-26 02:06:24
【问题描述】:

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

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

【问题讨论】:

标签: ios objective-c


【解决方案1】:

__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);

【讨论】:

    【解决方案2】:

    您可以选择精度,但假设是双精度值,您可以使用:

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

    输出:

    absolute value = 3.141590
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-30
        • 2013-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多