É possível utilizar seqüências de formato para NSStrings alinhar como números pode ser?
-
13-09-2019 - |
Pergunta
Eu estou usando NSLog () para imprimir alguns dados tabulares constituídos por um NSString e um associado número inteiro .
Suponha que eu sei que o comprimento da palavra mais longa.
Existe uma maneira usando formato cordas para obter este tipo de alinhamento da coluna:
word:tree rank:5 word:frog rank:3 word:house rank:2 word:peppercorn rank:2 word:sword rank:2 word:antlion rank:1
A razão que eu estou perguntando sobre a formatação de cordas é que eu estou esperando por uma maneira leve para formatar meu gueto saída de depuração.
Aqui está o que eu tentei:
NSString *word = @"tree";
NSUInteger rank = 4;
NSString *str = [NSString stringWithFormat:@"word:%-20@ rank:%u", word, rank];
NSLog(@"%@", str);
Resultado:
palavra: Rank árvore: 4
Sem efeito.
Solução
A seguir parece trabalho, mas requer a conversão do seu NSString de a C-strings.
NSString *word = @"tree";
NSUInteger rank = 4;
NSString *str = [NSString stringWithFormat:@"word:%-20s rank:%u", [word UTF8String], rank];
NSLog(@"%@", str);
Não sei porque a largura do campo está a ser ignorado quando se tenta usar um NSString.
Outras dicas
Sim, como printf
.
De acordo com o a documentação , obedece stringWithFormat:
a especificação printf
IEEE, que permite que todos os tipos de modificações nos argumentos individuais. A documentação tem um subconjunto restrito de que a informação, mas eles apontam para a OpenGroup printf
especificação para Unix para dar a informação completa (vale a pena ler, você pode fazer um monte de truques com especificadores de formato).
Tente isso, para obter exatamente o que você colou acima:
NSString *word = @"butterfly";
NSUInteger rank = 4;
NSString *str = [NSString stringWithFormat:@"word:%-11s rank:%u", [word UTF8String], rank];
Aqui está um exemplo de como eu formatar meu saída de depuração (Eu não uso NSLog
, eu embrulhar a impressão de erro padrão para obter o arquivo e linha, também):
fprintf(stderr, "%s | %30s:%-5d | %s", [[[NSDate date] description] UTF8String],
[fileName UTF8String], line, [body UTF8String]);
Se você fizer algo como a resposta anterior:
NSString *word = @"tree";
NSUInteger rank = 4;
NSString *str = [NSString stringWithFormat:@"word:%-20s rank:%u", [word UTF8String], rank];
NSLog(@"%@", str);
... você pode ter problemas de conversão de codificação para caracteres não-ASCII ... stringWithFormat parece assumir a codificação padrão do sistema, que ainda está MacRoman por algum motivo louco. Você pode cair para o nível stdlib - fazer todas as suas formatação com sprintf
em seu próprio buffer, e então você pode controlar a codificação ao criar um NSString de que - mas isso é complicado. Se alguém souber uma solução conveniente, eu sou todo ouvidos.