1

检查以下代码并创建一个 if 条件来检查元素类型浮点数和整数。我使用过但无法比较浮点值。

NSArray *a=[[NSArray alloc] initWithObjects:@"C",[NSNumber numberWithInt:120],[NSNumber numberWithFloat:333.222],[NSDate date], nil]; 

for (NSObject *x in a) 
{
    NSLog(@"%@",x);

    if([x isKindOfClass: [NSNumber class]])
    {
        //How i check float type with nsnumber
        NSLog(@"Integer Exist");
    }
    else if([x isKindOfClass:[NSString class]])
    {
        NSLog(@"String Exist");   
    }
    else if([x isKindOfClass:[NSDate class]])
    {
        NSLog(@"Date Exist");
    }
}
4

4 回答 4

5

NSNumberobjCType方法(继承自NSValue

浮动检查示例:

if ( strcmp([x objCType], @encode(float)) == 0 ) {
    // float value
}
于 2013-10-18T07:22:24.353 回答
2

整数和浮点数没有单独的类。NSNumber 用于两者。正如其他人所提到的, NSNumber 有一个objCType方法,它将返回一个表示 C 数字类型的字符串,例如intor float

然而...

不要假设它会返回您创建 NSNumber 的类型。NSNumber 可以自由使用任何能够表示数字的类型。通常它会选择较小的类型来节省内存。

例如,您可能假设在此数组的每个成员上调用 objcType:

NSArray *myArray = @[@1.2, @3.0f, @false];

将返回"d"(double)、"f"(float) 和"b"(bool)。

它不会。它可能会返回"f"(float)、"c"(char) 和"c"(char)`。或所有浮动。或者都是双打。它返回的确切内容是可能因操作系统版本而异的实现细节。

如果你只想检查给定的 NSNumber 是否包含整数,你应该抓住doubleValue并检查自己:

BOOL isInteger = abs(ceil(myNumber.doubleValue) - myNumber.doubleValue) < DBL_EPSILON;

如果您需要区分,例如,1.001,您需要将您的 NSNumber 包装在另一个包含附加信息的对象中。如上所述,这些信息在创建 NSNumber 时被丢弃。例如:

@interface MyNumber : NSObject
@property (strong, nonatomic) NSNumber *number;
@property (assign, nonatomic) BOOL isInteger;
@end
于 2013-10-18T09:32:23.233 回答
0

第一种方式

NSNumber *num=[NSNumber numberWithFloat:4.3];
if ( strcmp([num objCType], @encode(float)) == 0 ) {
    NSLog(@"Float value");
}

第二种方式

NSNumber *num=[NSNumber numberWithFloat:4.3];
NSString *str=[NSString stringWithFormat:@"%@",num];
NSArray *ary=[str componentsSeparatedByString:@"."];
if ([ary count]>1) {
    NSLog(@"Float value");
}
于 2013-10-18T07:29:11.447 回答
0

如果你只关心类,你可以使用 isKindOfClass:,但如果你想处理标量,你需要使用 property_getAttributes() 是正确的,它返回一个对类型信息进行编码的字符串。下面是一个基本函数,演示了您需要做什么。有关编码字符串的示例,请查看此处。

unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList([object class], &outCount);
for (i = 0; i < outCount; i++) {
    objc_property_t property = properties[i];
    char *property_name = property_getName(property);
    char *property_type = property_getAttributes(property);

    switch(property_type[1]) {
      case 'f' : //float
        break;
      case 's' : //short
        break;
      case '@' : //ObjC object
        //Handle different clases in here
        break;
    }
}
于 2013-10-18T07:24:34.460 回答