Можно ли использовать строки формата для выравнивания NSStrings, например, числа?
Я использую NSLog() для печати некоторых табличных данных, состоящих из NSString и связанного целого числа.
Предположим, что я знаю длину самого длинного слова.
Есть ли способ использовать строки формата, чтобы получить такое выравнивание столбцов:
word:tree rank:5
word:frog rank:3
word:house rank:2
word:peppercorn rank:2
word:sword rank:2
word:antlion rank:1
Причина, по которой я спрашиваю о форматировании строк, я надеюсь на легкий способ отформатировать вывод отладки гетто.
Вот что я пробовал:
NSString *word = @"tree";
NSUInteger rank = 4;
NSString *str = [NSString stringWithFormat:@"word:%[email protected] rank:%u", word, rank];
NSLog(@"%@", str);
Результат:
слово: дерево ранг: 4
Никакого эффекта.
Ответы
Ответ 1
Следующее, похоже, работает, но требует преобразования из вашей NSString в C-строки.
NSString *word = @"tree";
NSUInteger rank = 4;
NSString *str = [NSString stringWithFormat:@"word:%-20s rank:%u", [word UTF8String], rank];
NSLog(@"%@", str);
Не знаю, почему ширина поля игнорируется при попытке использовать NSString.
Ответ 2
Да, точно так же, как printf
.
Согласно документации, stringWithFormat:
подчиняется спецификации IEEE printf
, которая допускает всевозможные модификации отдельных аргументов. В документации имеется ограниченное подмножество этой информации, но они ссылаются на спецификацию OpenGroup printf
для Unix, чтобы предоставить полную информацию (стоит прочитайте, вы можете выполнить множество трюков с помощью спецификаторов формата).
Попробуйте это, чтобы получить то, что вы вставили выше:
NSString *word = @"butterfly";
NSUInteger rank = 4;
NSString *str = [NSString stringWithFormat:@"word:%-11s rank:%u", [word UTF8String], rank];
Вот пример того, как я отформатирую вывод отладки (я не использую NSLog
, я обертываю печать на стандартную ошибку, чтобы получить файл и строку):
fprintf(stderr, "%s | %30s:%-5d | %s", [[[NSDate date] description] UTF8String],
[fileName UTF8String], line, [body UTF8String]);
Ответ 3
Если вы сделаете что-то вроде более раннего ответа:
NSString *word = @"tree";
NSUInteger rank = 4;
NSString *str = [NSString stringWithFormat:@"word:%-20s rank:%u", [word UTF8String], rank];
NSLog(@"%@", str);
... вы можете получить проблемы с преобразованием кодировки для символов, отличных от ASCII... stringWithFormat, похоже, использует кодировку по умолчанию, которая по-прежнему является MacRoman по какой-то сумасшедшей причине. Вы можете перейти на уровень stdlib - сделайте все свое форматирование с помощью sprintf
в свой собственный буфер, а затем вы сможете управлять кодировкой при создании NSString, но это громоздко. Если кто-нибудь знает удобное обходное решение, я все уши.