2015-03-26 5 views
1

У меня есть ценность, исходящая с сервера API. Сервер хранит его как BigDecimal в Postgres. На стороне iOS значение имеет тип __NSCFNumber. Как получить абсолютное значение для NSCFNumber?Как получить абсолютное значение NSCFNumber?

Моя основная цель - это преобразовать это число в валюту.

+0

http://stackoverflow.com/a/4717090/396569 Было бы полезно. –

+0

Это внутреннее представление 'NSNumber'. Покажите код, как получить этот номер. – rmaddy

ответ

6

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

У вас есть выбор на точность , но при двойном значении вы можете использовать это:

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

Выходов:

absolute value = 3.141590 
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; 
    } 
} 
Смежные вопросы