Как дополнить строку справа с помощью stringWithFormat

Я хотел бы иметь возможность выравнивать строку по правому краю, используя пробелы. Я должен иметь возможность использовать метод stringWithFormat:.

До сих пор я пробовал рекомендуемый формат, и он не работает: [NSString stringWithFormat:@"%10@",@"test"].

Я ожидаю, что это вернет строку с шестью пробелами, за которой следует «тест», но все, что я получаю, это «тест» без пробелов.


person zachzurn    schedule 12.02.2013    source источник
comment
Для правильного padding я обычно просто добавляю длинную строку пробелов, а затем усекаю до нужной длины. Для выравнивания по правому краю вы можете сделать что-то подобное, только обрезать с противоположного конца.   -  person Hot Licks    schedule 12.02.2013


Ответы (2)


Похоже, что stringWithFormat игнорирует запросы определения размера спецификатора формата %@. Однако спецификатор %s работает корректно:

NSString *test = @"test";
NSString *str = [NSString stringWithFormat:@"%10s", [test cStringUsingEncoding:NSASCIIStringEncoding]];
NSLog(@"'%@'", str);

Это печатает ' test'.

person Sergey Kalinichenko    schedule 12.02.2013
comment
Поскольку NSString может содержать любой символ Юникода, лучше использовать [test UTF8String] вместо преобразования в ASCII. - person rmaddy; 12.02.2013
comment
Это сработало для меня. Есть идеи, почему это не работает с '%@'? - person zachzurn; 12.02.2013
comment
@zachzurn Обидно, что реализация Apple спецификатора формата %@ не учитывает стандартные модификаторы из спецификации IEEE для %s. Хотя это достаточно простой обходной путь. Конечно, более общим решением, которое будет работать с любым объектом, будет использование [[someObject description] UTF8String]. - person rmaddy; 12.02.2013
comment
@zachzurn Мое лучшее предположение заключается в том, что люди, стоящие за библиотеками Apple, решили, что объектам уже предоставлен способ обработки их собственных дополнений в методе description, поэтому добавление второго способа не требуется. Строки C, целые числа и т. д., с другой стороны, являются простыми типами без методов, поэтому было необходимо добавить некоторые возможности форматирования. Опять же, это только мое предположение. - person Sergey Kalinichenko; 12.02.2013
comment
@rmaddy Я согласен. Apple прямо заявляет, что они следуют спецификации IEEE для stringWithFormat здесь: developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ - person zachzurn; 12.02.2013
comment
@zachzurn Имейте в виду, что %@ не является частью спецификации IEEE. Таким образом, они могут сказать, что следуют спецификации (потому что так и есть), плюс они добавили поддержку %@ для объектов Objective-C. Я только что подал отчет об ошибке с просьбой о той же поддержке модификатора для %@, что и для %s. - person rmaddy; 12.02.2013
comment
@dasblinkenlight Метод description можно реализовать таким образом, чтобы к выходным данным добавлялось желаемое заполнение. Но здесь есть небольшая проблема. %@ используется с любым объектом на основе NSObject, включая NSString. Поскольку у нас нет контроля над методом description для NSString, было бы неплохо, если бы %@ поддерживал модификаторы, такие как %s. Никогда нельзя полагаться на вызовы метода description, за исключением случаев, когда он используется с NSString. - person rmaddy; 12.02.2013
comment
Я подозреваю, что основная причина того, что %@ не учитывает модификаторы формата, такие как размер, заключается в том, что на самом деле это НЕ формат, а скорее вызов метода описания объекта, формат которого заранее неизвестен (например, NSDictionary или описание NSArray - - как вы можете изменить размер этого или любого пользовательского описания объекта?) - person Motti Shneor; 04.08.2019
comment
Важно помнить, что в iOS/Mac-OS и во всех других местах, где используется NSString, выравнивание текста НЕ должно основываться на заполнении пробелами, потому что ширина пробелов и других символов НЕ одинакова, за исключением очень специальные (моноширинные) шрифты. - person Motti Shneor; 08.08.2019

Это форматирование в стиле C. %nd означает, что ширина равна n.

проверьте следующий код.

NSLog(@"%10@",[NSString stringWithFormat:@"%10@",@"test"]);
NSLog(@"%@",[NSString stringWithFormat:@"      %@",@"test"]);
NSLog(@"%10@", @"test");
NSLog(@"%10s", [@"test" cStringUsingEncoding:[NSString defaultCStringEncoding]]);
NSLog(@"%10d", 1);

NSString *str = @"test";
int padding = 10-[str length]; //6
if (padding > 0) 
{
   NSString *pad = [[NSString string] stringByPaddingToLength:padding withString:@" " startingAtIndex:0];
   str = [pad stringByAppendingString:str];
}
NSLog(@"%@", str);
person bitmapdata.com    schedule 12.02.2013
comment
Намного проще использовать %s вместо %@. Просто преобразуйте NSString в C-строку, используя UTF8String. %@ учитывает спецификатор ширины. - person rmaddy; 12.02.2013
comment
Вы можете заменить [NSString string] на @"". - person rmaddy; 12.02.2013
comment
@maddy UTF8String не обязан ничего возвращать и будет работать только в том случае, если фактический экземпляр NSString имеет один непрерывный блок символов UTF8 в качестве базового хранилища. В любом другом случае (другая кодировка, большие строки, ставшие связанными списками и т. д.) этот метод возвращает nil. - person Motti Shneor; 08.08.2019