13

我正在使用NSLog()打印一些由NSString和关联的integer组成的表格数据。

假设我知道最长单词的长度。

有没有办法使用格式字符串来获得这种列对齐:

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

完全没有效果。

4

3 回答 3

17

以下似乎可行,但需要从您的 NSString 转换为 C 字符串。

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

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

于 2009-11-04T05:03:21.227 回答
1

是的,就像printf.

根据文档stringWithFormat:遵循 IEEEprintf规范,该规范允许对各个参数进行各种修改。该文档包含该信息的受限子集,但它们链接到 Unix 的OpenGroupprintf规范以提供完整信息(值得一读,您可以使用格式说明符完成很多技巧)。

试试这个,以获得您在上面粘贴的内容:

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]);
于 2009-11-04T03:37:32.063 回答
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 时可以控制编码——但这很麻烦。如果有人知道一个方便的解决方法,我会全神贯注。

于 2011-09-21T20:13:15.580 回答