初认Objective-c NSNumber NSInteger int NSNumber转换

    在Objective-c中有int的数据类型,还要用NSNumber?这是因为int不是对象。
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一样都可以是对象。


最后我们再来扯一扯objective-c中数字型字符串转换NSNumber:

我们首先写个方法如下:

    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值