Использование [- doubleValue]
, [- stringValue]
или [- decimalValue]
может показать, было ли исходное значение отрицательным при создании с использованием подписанного метода init.
Я удивлен, что нет простой - wasCreatedSigned
функциональности.
BOOL negTest;
negTest = ([myNSNumber doubleValue] < 0); // <0.1 micro sec
negTest = [[myNSNumber stringValue] hasPrefix:@"-"]; // >1.5 micro sec
negTest = ([myNSNumber decimalValue]._isNegative); // >2.5 micro sec
negTest = ([myNSDecimalNumber decimalValue]._isNegative); // <0.1 micro sec
Внутренне NSNumber IS знает о подписанном состоянии его значения.
Что касается -objCType
Я заметил, что это не всегда отражает тип init, как сказано в документации. Но он будет точно отличать числа с плавающей запятой (double) (d) от целых чисел (c, s, i, q, Q ...).
Вот код, с которым можно поиграть, он покажет некоторые странности (проверено на iOS 4.3):
void isNeg(NSNumber* num, NSString* initMethod);
void isNeg(NSNumber* num, NSString* initMethod)
{
printf("\r");
NSLog(@"%@ (class:%@)", initMethod, [num class]);
double dval = [num doubleValue];
NSLog(@"Is Negative:%c, objCType:%s", (dval<0)?'Y':'N', [num objCType]);
NSLog(@"strVal: %@", [num stringValue]);
NSLog(@"%%f : %f", dval);
NSLog(@"%%g : %g", dval);
NSLog(@"%%lld : %lld", [num longLongValue]);
NSLog(@"%%llu : %llu", [num unsignedLongLongValue]);
}
// main...
double testDouble = 10001e-9;
Class nc = [NSNumber class];
isNeg([nc numberWithChar: -1], @"Char");
isNeg([nc numberWithChar: -2], @"Char");
isNeg([nc numberWithChar: -3], @"Char");
isNeg([nc numberWithChar: 1], @"Char");
isNeg([nc numberWithChar: 12], @"Char");
isNeg([nc numberWithChar: 13], @"Char");
isNeg([nc numberWithUnsignedChar: 12], @"UChar");
isNeg([nc numberWithUnsignedChar: 13], @"UChar");
isNeg([nc numberWithLongLong: -LONG_LONG_MAX], @"LongLong");
isNeg([nc numberWithLongLong: LONG_LONG_MAX], @"LongLong");
isNeg([nc numberWithUnsignedLongLong: ULONG_LONG_MAX], @"ULongLong");
isNeg([nc numberWithDouble:-LONG_LONG_MAX], @"Double");
isNeg([nc numberWithDouble: ULONG_LONG_MAX], @"Double");
isNeg([nc numberWithDouble:-testDouble], @"Double");
isNeg([nc numberWithDouble: testDouble], @"Double");
nc = [NSDecimalNumber class];
isNeg([nc numberWithDouble:-testDouble], @"Double");
isNeg([nc numberWithDouble: testDouble], @"Double");