2012-05-26 3 views
1

Je faisais une méthode de base qui prend une URL d'image Flickr et renvoie l'ID de l'image. Je passe la méthode NSString@"http://farm6.staticflickr.com/5183/5629026092_c6762a118f".NSString intValue déformer nombre réel

L'objectif est de renvoyer l'int: 5629026092, qui se trouve dans l'URL de l'image et est l'ID de l'image.

Voici ma méthode:

-(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; 
} 

La sortie de la console est:

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 

Pourquoi appeler intValue déformant le nombre réel?

+0

double possible de [Conversion chaîne en int en Objective C changer la valeur] (http://stackoverflow.com/questions/10606281/ converting-string-to-int-in-objective-c-change-the-value) –

+0

Vous pouvez utiliser NSInteger au lieu de int pour stocker le plus grand nombre. – lnafziger

Répondre

1

Utilisez long long à la place, votre numéro est supérieur à int peut gérer (max étant 2147483647 comme vous pouvez le voir dans votre deuxième journal)

0

facile ^^: INT_MAX Valeur maximale pour une variable de type int. 2147483647

1

Votre valeur est trop grande pour représenter en 32 bits. La plus grande valeur que vous pouvez stocker dans un entier signé 32 bits (int) est 2147483647. Pour les ints non signés, c'est 4294967295. Vous devez convertir en entier long pour représenter un nombre aussi grand que 5629026092.

probablement besoin de créer un formateur de nombres pour cela. Je ne suis pas un expert en formatage de nombres, et je dois toujours trouver la documentation pour comprendre comment les utiliser.

Je viens d'essayer, et ce code fonctionne:

NSString *numberString = @"5629026092"; 

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

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

Vous pouvez également convertir la chaîne à une scanf chaîne C et de l'utilisation, venez y penser.

0

Je trouve que cela est un moyen pratique de le faire:

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;