使用[- 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类型,如文档所述。但它会准确区分花车/双打(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");
我有一个程序,我知道这是在创作什么类型的号码。但我可能以后访问这个号码,我需要知道如何在访问时输入它。如果你能想到更优雅的做法,我愿意提出建议。 – banDedo 2011-04-27 22:10:31