# Formattage NSString vs formattage C



## tomz (24 Juillet 2010)

Bonjour,

J'essaye le code suivant dans Xcode 3.2.3 :

```
NSLog(@"%.9@", @"chaine super longue");
	NSLog(@"%.9s", "chaine super longue");
```

Résultat :

```
chaine super longue
chaine su
```

Il est apparemment impossible de tronquer les NSString comme on peut le faire pour les chaines de caractères en C ... pourtant c'est censé être le cas [1]. 
Est-il possible de formatter les NSString comme en C ? Ou est-ce qu'il faut forcément passer par les fonctions C ? Est-ce une limitation connue et mentionnée dans la documentation officielle (je n'ai pas trouvé) ?

Merci
[1] http://www.cocoadocs.com/NSString_-_initWithFormat: "Indicates how many decimal places to use for numeric data or how many characters to truncate after for string data."


----------



## ntx (24 Juillet 2010)

1/ Les docs Cocoa on va les lire chez Apple pas chez Cocoadocs 
2/ Où dans cette page as-tu vu que %.n s'appliquait à @ ?


----------



## tomz (24 Juillet 2010)

ntx a dit:


> 1/ Les docs Cocoa on va les lire chez Apple pas chez Cocoadocs


Comme j'ai rien trouvé dans la doc Apple, même pas le fait que cela n'est pas possible, alors j'ai cherché ailleurs ... la doc officielle est très légère sur le sujet entre ton lien et [2]



> 2/ Où dans cette page as-tu vu que %.n s'appliquait à @ ?


Dans cette page c'est écrit que ça tronque dans le cas d'une chaine de caractères (cf. partie soulignée de mon message), or à part le NSString, il n'y a pas d'autre type de chaines de caractères cité dans la page. En toute logique, j'ai donc déduit que ça s'appliquait aux NSString. (Trop vite apparemment)

J'ai bien compris que ce n'est pas possible avec les NSString, je cherche 
1) une source officielle qui formalise cette limitation. Amha, c'est plutôt une régression de fonctionnalités par rapport aux chaines C et complique certaines instructions mais bon.
2) la bonne pratique pour formater des NSString ala C : 
- conversion vers char *
  - sprintf
  - conversion vers NSString​Exemple (est-ce la meilleure solution ?) :

```
NSString *ns_chaine = @"chaine super longue";
	const char *chaineC = [ns_chaine UTF8String];
	char chaineCtronquee[10];
	sprintf(chaineCtronquee, "%.9s", chaineC);
	NSString *ns_chaine_tronquee = [[NSString alloc] initWithUTF8String:chaineCtronquee];
	NSLog(@"Chaine NSString tronquee: %@", ns_chaine_tronquee);
```

[2] http://developer.apple.com/mac/libr...onceptual/Strings/Articles/FormatStrings.html

---------- Nouveau message ajouté à 19h15 ---------- Le message précédent a été envoyé à 17h19 ----------

J'ai trouvé plus simple avec stringWithFormat, m'enfin c'est quand même dommage de devoir passer par des conversions alors qu'il ne semble pas compliqué de porter les formats. 

Les conversions peuvent être la source de nombreux problèmes ...


----------



## tatouille (25 Juillet 2010)

//  Les conversions peuvent être la source de nombreux problèmes ...

chez les debiles peu etre,


c'est comme en c++ il n'y a pas de formatteur sur une class storage qui store les valeurs utilisant utf-16, et quand c'est du pure ascii NSSimpleString (placeholder privé)

il y a un accessor pour une chaine ansi -> UTF8String

sinon tu peux acceder aux raw bytes

// une source officielle qui formalise cette limitation. Amha, c'est plutôt une régression de fonctionnalités par rapport aux chaines C et complique certaines instructions mais bon.

non les chaines ansi ne gere pas le multibyte, tes commentaires sont ceux d'un enfant et surtout ce qui concerne le C.

ton experience ne doit pas depasser le "hello world"

bytelen != stringlen a l'exception de ascii


----------



## tomz (25 Juillet 2010)

Merci pour le rappel du codage, c'est tout à fait juste. 
J'ai résolu mon problème avec *substringToIndex*, pour les archives si ça peut aider d'autres personnes.


----------

