Objective c NSString intValue使实际数字变形

Objective c NSString intValue使实际数字变形,objective-c,cocoa-touch,nsstring,integer,Objective C,Cocoa Touch,Nsstring,Integer,我正在制作一个基本方法,它获取Flickr图像URL并返回图像的ID。 我正在向该方法传递NSString@”http://farm6.staticflickr.com/5183/5629026092_c6762a118f“ 目标是返回int:5629026092,它位于图像的URL中,是图像的ID 以下是我的方法: -(int)getImageIDFromFlickrURL:(NSString *)imageURL{ NSArray *objectsInURLArray = [imag

我正在制作一个基本方法,它获取Flickr图像URL并返回图像的ID。 我正在向该方法传递
NSString
@”http://farm6.staticflickr.com/5183/5629026092_c6762a118f“

目标是返回int:
5629026092
,它位于图像的URL中,是图像的ID

以下是我的方法:

-(int)getImageIDFromFlickrURL:(NSString *)imageURL{
    NSArray *objectsInURLArray = [imageURL componentsSeparatedByString:@"/"];
    NSString *lastObjectInFlickrArray = [objectsInURLArray lastObject];
    NSArray *dirtyFlickrIdArray = [lastObjectInFlickrArray componentsSeparatedByString:@"_"];
    NSString *flickIDString = [dirtyFlickrIdArray objectAtIndex:0];
    NSLog(@"flickr id string: %@",flickIDString);
    int flickrID = [flickIDString intValue];
    NSLog(@"id: %i",flickrID);
    return flickrID;
}
控制台中的输出为:

2012-05-26 13:30:25.771 TestApp[1744:f803] flickr id string: 5629026092
2012-05-26 13:30:25.773 TestApp[1744:f803] id: 2147483647

为什么调用
intValue
会使实际数字变形?

使用
long
相反,您的数字大于
int
可以处理的范围(最大值为
2147483647
,您可以在第二个日志中看到)

Easy^^:INT\u INT类型变量的最大值。2147483647

您的值太大,无法用32位表示。可以存储在有符号32位整数(int)中的最大值为2147483647。对于未签名整数,它是4294967295。您需要转换为一个长整数来表示一个5629026092大小的数字

您可能需要为此创建一个数字格式化程序。我不是数字格式化程序方面的专家,而且总是需要挖掘文档来找出如何使用它们

我刚试过,这段代码有效:

  NSString *numberString = @"5629026092";

  NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];

  NSNumber *number = [formatter numberFromString: numberString];
  long long value = [number longLongValue];
  NSLog(@"%@ = %qi", numberString, value);
  [formatter release];

您还可以将字符串转换为C字符串并使用scanf,想想看。

我发现这是一种方便的方法:

NSString *flickIDString = [dirtyFlickrIdArray objectAtIndex:0]; // read some huge number into a string

// read into a NSNumber object or a long long variable. you choose
NSNumber *flickIDNumber = flickIDString.longLongValue;
long long flickIDLong = flickIDString.longLongValue;

您可以使用NSInteger而不是int来存储较大的数字。