Est-il possible d'utiliser des chaînes de format pour aligner NSStrings comme les numéros peuvent être?

StackOverflow https://stackoverflow.com/questions/1671531

  •  13-09-2019
  •  | 
  •  

Question

J'utilise NSLog () pour imprimer des données tabulaires constitués d'un NSString et un élément associé entier .

Supposons que je sais la longueur du mot le plus long.

Est-il possible en utilisant des chaînes format pour obtenir ce genre d'alignement de la colonne:

word:tree        rank:5  
word:frog        rank:3  
word:house       rank:2  
word:peppercorn  rank:2  
word:sword       rank:2  
word:antlion     rank:1  

La raison pour laquelle je demande sur le formatage des chaînes est j'espère un moyen léger pour formater ma sortie de débogage du ghetto.

Voici ce que j'ai essayé:

NSString *word = @"tree";
NSUInteger rank = 4;
NSString *str = [NSString stringWithFormat:@"word:%-20@ rank:%u", word, rank];
NSLog(@"%@", str);

Résultat:

mot: rang arbre: 4

Aucun effet.

Était-ce utile?

La solution

Ce qui suit semble fonctionner, mais nécessite la conversion de votre NSString de C-chaînes.

NSString *word = @"tree";
NSUInteger rank = 4;
NSString *str = [NSString stringWithFormat:@"word:%-20s rank:%u", [word UTF8String], rank];
NSLog(@"%@", str);

Je ne sais pas pourquoi la largeur de champ est ignoré lorsque vous essayez d'utiliser un NSString.

Autres conseils

Oui, tout comme printf.

Selon la documentation , stringWithFormat: obéit à la spécification IEEE printf, ce qui permet à tous les types de modifications sur les arguments individuels. La documentation a un sous-ensemble restreint de cette information, mais ils sont liés aux OpenGroup printf spécification pour Unix pour donner les informations complètes (d'une valeur d'une lecture, vous pouvez accomplir beaucoup de tours avec spécificateurs de format).

Essayez ceci, pour obtenir exactement ce que vous avez collé ci-dessus:

NSString *word = @"butterfly";
NSUInteger rank = 4;
NSString *str = [NSString stringWithFormat:@"word:%-11s rank:%u", [word UTF8String], rank];

Voici un exemple de la façon dont je formater ma sortie de débogage (je n'utilise NSLog, j'enveloppe d'erreur standard pour obtenir le fichier et la ligne aussi):

fprintf(stderr, "%s | %30s:%-5d | %s", [[[NSDate date] description] UTF8String],
    [fileName UTF8String], line, [body UTF8String]);

Si vous faites quelque chose comme la réponse précédente:

NSString *word = @"tree";
NSUInteger rank = 4;
NSString *str = [NSString stringWithFormat:@"word:%-20s rank:%u", [word UTF8String], rank];
NSLog(@"%@", str);

... vous pouvez avoir des problèmes de codage de conversion pour les caractères non-ASCII ... stringWithFormat semble supposer l'encodage par défaut du système, qui est encore MacRoman pour une raison folle. Vous pouvez descendre au niveau stdlib - faire tout votre mise en forme avec sprintf dans votre propre tampon, et vous pouvez contrôler le codage lors de la création d'un NSString à partir - mais c'est lourd. Si quelqu'un connaît une solution pratique, je suis tout ouïe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top