是否可以使用格式字符串来对齐NSStrings,就像数字一样?

时间:2009-11-04 03:27:47

标签: objective-c format-string

我正在使用 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  

我问的格式化字符串的原因是我希望用一种轻量级的方式来格式化我的ghetto调试输出。

以下是我尝试的内容:

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

结果:

字:树排名:4

完全没有效果。

3 个答案:

答案 0 :(得分:17)

以下似乎有效,但需要从NSString转换为C字符串。

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

在尝试使用NSString时,不知道为什么忽略字段宽度。

答案 1 :(得分:1)

是的,就像printf

根据the documentationstringWithFormat:遵守IEEE printf规范,该规范允许对各个参数进行各种修改。文档中包含该信息的受限子集,但它们链接到OpenGroup printf specification for 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]);

答案 2 :(得分:0)

如果你做了类似早期答案的事情:

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时控制编码 - 但这很麻烦。如果有人知道一个方便的解决方法,我会全力以赴。