2010-08-11 11 views
1

Je suis à la recherche d'une bonne routine propre pour transformer un NSArray contenant NSNumbers (entiers) en une belle chaîne lisible en anglais. Par exemple, je veux changer ceci:Défi: Comment transformer un NSArray de nombres en une liste lisible en anglais

[NSArray arrayWithObjects:[NSNumber numberWithInt:5], 
          [NSNumber numberWithInt:7], 
          [NSNumber numberWithInt:12], 
          [NSNumber numberWithInt:33], nil]; 

dans ce:

5, 7, 12 et 13.

Est-il possible de bien faire cela sans hideux si logique de déclaration? Je suis sûr que cela peut être fait avec une expression régulière, mais est-ce possible dans le code pré-iOS 4?

Merci! :)

: -Joe

Répondre

2

maman Regardez, pas de si!

NSString *seps[] = {@" and ",@"",@", ",nil,nil,@", "}, *o = @".", *sep = o; 
for (NSNumber *n in [arr reverseObjectEnumerator]) { 
    o = [NSString stringWithFormat:@"%@%@%@",n,sep = seps[[sep length]],o]; 
} 

NSLog(@"out: %@",o); 

sortie:

out: 5, 7, 12 and 33. 

mais pourquoi?

modifier ici est une version compréhensible sans "énorme if/else construire"

NSString *out = @""; // no numbers = empty string 
NSString *sep = @"."; // the separator first used is actually the ending "." 
for (NSNumber *n in [arr reverseObjectEnumerator]) 
{ 
    out = [NSString stringWithFormat:@"%@%@%@",n,sep,out]; 
    if ([sep isEqualToString:@"."]) // was the separator the ending "." ? 
    { 
     sep = @" and "; // if so, put in the last separator " and " 
    } else { 
     sep = @", "; // otherwise, use separator ", " 
    } 
} 

Cela chaînes de sortie comme

0 elements: ""  (i.e. empty) 
1 element: "33." 
2 elements: "12 and 33." 
3 elements: "7, 12 and 33." 
+0

Génie! Merci :) C'est pour une interface multitouch, où l'utilisateur peut sélectionner différents éléments sur l'écran simultanément. Je peux donc écrire sur une étiquette en anglais, quels numéros sont sélectionnés. Félicitations, vous gagnez ... Mon admiration! ;-) – jowie

+0

* Ne l'avez-vous jamais mis dans un vrai projet * ;-) – mvds

+0

pourquoi est-ce mauvais? : -. – jowie

4
NSArray *numbers = [NSArray arrayWithObjects:[NSNumber numberWithInt:5], 
          [NSNumber numberWithInt:7], 
          [NSNumber numberWithInt:12], 
          [NSNumber numberWithInt:33], nil]; 
NSArray *first = [numbers subarrayWithRange:NSMakeRange(0, [numbers count]-1)]; 
NSString *joined = [[first componentsJoinedByString:@", "] stringByAppendingFormat:(([first count] > 0) ? @"and %@" : @"%@"), [numbers lastObject]]; 
+0

Je ne sais pas si cela fonctionne, mais il ressemble cela devrait. Assez génial: D –

+0

Si cela est pour le débogage, ne pas oublier '[description d'un tableau]'. – Justin

+1

Cela se traduit par * "et 5" * pour un tableau contenant seulement 5. –