我在用着 NSLog() 打印一些表格数据,其中包含 NS字符串 以及相关的 整数.

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

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

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