Подтвердить что ты не робот

Можно ли использовать строки формата для выравнивания 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

Никакого эффекта.

4b9b3361

Ответ 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, но это громоздко. Если кто-нибудь знает удобное обходное решение, я все уши.