NSNumber是数据对象,我们可以使用NSNumber数据对象来创建和初始化不同类型的数字对象。
#import <Foundation/Foundation.h>
NSNumber *myNumber,*floatNumber,*intNumber,*number1;
//创建integer类型对象
intNumber = [NSNumber numberWithInteger:123];
NSLog(@"%i",[intNumber integerValue]);
//创建long类型对象
myNumber = [NSNumber numberWithLong:0xababab];
NSLog(@"%lx",[myNumber longValue]);
//创建char类型对象
myNumber = [NSNumber numberWithChar:'K'];
NSLog(@"%c",[myNumber charValue]);
//创建float类型对象
floatNumber = [NSNumber numberWithFloat:123.00];
NSLog(@"%f",[floatNumber floatValue]);
//创建double类型对象
myNumber = [NSNumber numberWithDouble:112233e+15];
NSLog(@"%lg",[myNumber doubleValue]);
//判断两个对象的值是否相等
if ([intNumber isEqualToNumber:floatNumber] == YES ) {
NSLog(@"值相等");
} else {
NSLog(@"值不相等");
}
//比较两个对象的值大小
if ( [intNumber compare:myNumber] == NSOrderedAscending) {
NSLog(@"左边的数字小");
} else {
NSLog(@"左边的数字大");
}
//初始化实例
number1 = [[NSNumber alloc] initWithInt:1000];
NSLog(@"%d",[number1 intValueunsigned];
[number1 release];
对于每个数字基本类型,类方法都为这它分配了一个NSNumber对象,并将其设置为指定的值,这些方法都是以numberWith开始的,之后是类型,如numberWithLong。
此外,还可以使用实例方法为先前分配的NSNumber对象设定指定的值,这些都是以initWith开头,比如initWithLong。
对于初学者来说,那么问题来了?那么说到int他和NSInteger又有什么区别呢?
在c语言中,int和long的字节数是和操作系统指针所占位数相等。
但c语言中说,long的长度永远大于或等于int
objective-c里,苹果的官方文档中总是推荐用NSInteger
它和int有什么区别呢,stackoverflow这帮大神给了答案。
原来在苹果的api实现中,NSInteger是一个封装,它会识别当前操作系统的位数,自动返回最大的类型。
定义的代码类似于下:
#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
很简单的总结:那就是NSInteger与int的区别是NSInteger会根据系统的位数(32or64)自动选择int的最大数值(int or long)还有就是他和NSString一样都可以是对象。
我们首先写个方法如下:
id result;
NSString * ss;
ss=@"124";
result=[NSNumber numberWithFloat:[ss floatValue]];
NSLog(@"%f",[ss floatValue]);
NSLog(@"%f",[result floatValue]);
直接将NSString类的floatValue方法将ss对象转成float类型,再使用NSNumber的numberWithFloat方法转成NSNumber类型的对象。
但这里有一个问题,如果ss不是@”111.22”,而是@“xxx”,则该方法将报错的。
因此,这里需要一个事先判断,判断ss是不是能转成成NSNumber。
根据这个修改要求,我再将代码转换成这样:
ss=@"224.34129";
NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
if ([f numberFromString:ss])
{
result=[NSNumber numberWithFloat:[ss floatValue]];
}
else
{
result=ss;
}
NSLog(@"%.2f",[result floatValue]);
这样,功能是没有问题了。但看过之后,觉得有点累赘感。
代码简洁点可不可以呢?最终修改成这样几行,如下所示:
ss=@"324.34";
result=[f numberFromString:ss];
if(!(result))
{
result=ss;
}
NSLog(@"%.2f",[result floatValue]);
测试结果如下:
2012-08-07 17:35:04.203 apple1[2484] 124.000000
2012-08-07 17:35:04.203 apple1[2484] 124.000000
2012-08-07 17:35:04.203 apple1[2484] 224.34
2012-08-07 17:35:04.203 apple1[2484] 324.34