É possível utilizar seqüências de formato para NSStrings alinhar como números pode ser?

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

  •  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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top