【问题标题】:Is it possible to use format strings to align NSStrings like numbers can be?是否可以像数字一样使用格式字符串来对齐 NSStrings?
【发布时间】:2010-12-12 21:26:56
【问题描述】:

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

完全没有效果。

【问题讨论】:

  • 哈哈哈 +1 用于 ghetto-debugging 标签

标签: objective-c format-string


【解决方案1】:

以下似乎可行,但需要从您的 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 )会怎么样?
  • @Anthony Cramp : 如果字符串长度更长,它将不起作用....如果字符串长度大于列长度,则要修剪字符串怎么办...
【解决方案2】:

是的,就像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]);

【讨论】:

  • 如果这个词是“树”,你会得到什么。我得到“word:tree rank:4”,它似乎对列说明符没有反应。
  • @willc2:我已经用 Anthony 的信息编辑了我的答案,试一试。
  • @JedSmith,我可以知道如何在 Swift 中进行操作吗? TYIA
【解决方案3】:

如果你做类似之前的回答:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多