¿Es posible utilizar cadenas de formato para alinear NSStrings como números pueden ser?
-
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.
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.