Можно ли использовать строки формата для выравнивания NSString, как это могут быть числа?

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

  •  13-09-2019
  •  | 
  •  

Вопрос

я использую НСлог() для печати некоторых табличных данных, состоящих из НСстринг и связанный с ним целое число.

Предположим, я знаю длину самого длинного слова.

Есть ли способ использовать строки формата чтобы получить такое выравнивание столбцов:

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:%-20@ rank:%u", word, rank];
NSLog(@"%@", str);

Результат:

слово:дерево ранг:4

Никакого эффекта вообще.

Это было полезно?

Решение

Кажется, что следующее работает, но требует преобразования ваших NSString в C-строки.

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

Не знаю, почему ширина поля игнорируется при попытке использовать NSString.

Другие советы

Да, точно так же, как printf.

В соответствии с документация, stringWithFormat: подчиняется IEEE printf спецификация, которая допускает всевозможные модификации отдельных аргументов.В документации содержится ограниченный набор этой информации, но они ссылаются на Открытая группа 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]);

Если вы сделаете что-то вроде предыдущего ответа:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top