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

13
我正在使用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  
我询问格式化字符串的原因是我希望有一种轻量级的方式来格式化我的手动调试输出。 这是我尝试过的:
NSString *word = @"tree";
NSUInteger rank = 4;
NSString *str = [NSString stringWithFormat:@"word:%-20@ rank:%u", word, rank];
NSLog(@"%@", str);

结果:

单词:tree 排名:4

完全没有影响。


1
哈哈哈,给“ghetto-debugging”标签加上一个+1。 - nall
3个回答

17

下面的方法似乎可行,但需要将你的NSString转换为C字符串。

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

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


如果你有一个完整的字符串(例如 1 Item1 6 0% 6),那会是怎样的呢? - n0minal
@Anthony Cramp:如果字符串长度超过列长度,它将无法工作...如果想要在字符串长度超过列长度时修剪字符串怎么办... - Nitin

1

是的,就像printf一样。

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

尝试这个,以获得与您上面粘贴的内容完全相同的结果:

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]);

如果单词是“tree”,你会得到什么?我得到的是“word:tree rank:4”,但似乎不受列说明符的影响。 - willc2
@willc2:我已经根据Anthony的信息编辑了我的答案,请尝试一下。 - Jed Smith
@JedSmith,我能知道如何用Swift做吗?TYIA - Lie-An

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接