¿Es posible utilizar cadenas de formato para alinear NSStrings como números pueden ser?

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

  •  13-09-2019
  •  | 
  •  

Pregunta

estoy usando NSLog () para imprimir algunos datos tabulares que consisten en un NSString y un entero asociado .

Asuma que sé la longitud de la palabra más larga.

¿Hay alguna manera el uso de cadenas formato para obtener este tipo de alineación de la columna:

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 razón por la que estoy preguntando sobre el formato de cadenas es que estoy esperando una manera ligera para dar formato a mi gueto de salida de depuración.

Esto es lo que he intentado:

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

Resultados:

palabra: árbol rango: 4

No afecta en absoluto.

¿Fue útil?

Solución

La siguiente parece que funciona, pero requiere la conversión de su NSString de a C-cadenas.

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

No sé por qué la anchura del campo es ignorado cuando se trata de utilizar un NSString.

Otros consejos

Sí, al igual que printf.

Según la documentación , stringWithFormat: obedece a la especificación IEEE printf, que permite todo tipo de modificaciones en los argumentos individuales. La documentación tiene un subconjunto restringido de esa información, pero que enlazar a la OpenGroup printf especificación para Unix para dar la información completa (vale la pena leer, se puede lograr una gran cantidad de trucos con los especificadores de formato).

Prueba de esto, para obtener exactamente lo que usted ha pegado arriba:

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

Aquí hay un ejemplo de cómo formatear mi salida de depuración (no uso NSLog, envuelvo la impresión de error estándar para obtener el archivo y la línea, también):

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

Si haces algo como la respuesta anterior:

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

... puede obtener problemas de codificación de conversión para caracteres no ASCII ... stringWithFormat parece asumir la codificación por defecto del sistema, que todavía está MacRoman por alguna razón loca. Usted puede caer hasta el nivel stdlib - hacer todo el formato con sprintf en su propio buffer, y luego se puede controlar la codificación al crear una NSString de que - pero eso es engorroso. Si alguien conoce una solución conveniente, soy todo oídos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top