正确填充 NSString 的 Objective-c 代码?

Posted

技术标签:

【中文标题】正确填充 NSString 的 Objective-c 代码?【英文标题】:objective-c code to right pad a NSString? 【发布时间】:2011-07-20 04:06:38 【问题描述】:

谁能给出一个代码示例,说明如何在objective-c中正确填充NSString?

例如想要这些字符串:

Testing 123 Long String
Hello World
Short 

如果右填充到 12: 的列宽,然后在每个末尾添加一个字符串“XXX”,它将给出:

Testing 123 xxx
Hello World xxx
Short       xxx

这是第 2 列想起来的。

【问题讨论】:

【参考方案1】:

亚当走在正确的轨道上,但并不完全正确。你确实想使用+stringWithFormat:,但不像他建议的那样。如果您想将“someString”填充到(例如)至少 12 个字符,您可以使用宽度说明符作为格式的一部分。由于您希望结果左对齐,因此您需要在宽度说明符之前加上减号:

NSString *padded = [NSString stringWithFormat:@"%-12@", someString];

或者,如果您希望结果是正好 12 个字符,您可以同时使用最小和最大宽度说明符:

NSString *padded = [NSString stringWithFormat:@"%-12.12@", someString];

【讨论】:

谢谢 - 我想当我查看 doco 时,我可能假设您使用的格式化字符串仅用于小数,但如果它们适用于字符串,那就太好了 NSString *someString = @"123456789012345678"; NSString *padded = [NSString stringWithFormat:@"%-30@", someString]; NSLog(@"%@", someString); NSLog(@"%@", 填充);据我了解,上面的代码应该给出 someString 的正确填充版本。但是,它会两次打印出相同的字符串。我错过了什么吗? 不幸的是,根据 Johannes 的评论,我还发现 %@ 格式化程序没有添加空格。 我注意到使用带有附加字符串的UTF8String 将按预期工作。 NSString *someString = @"123456789012345678"; NSString *padded = [NSString stringWithFormat:@"%-30s%@", [someString UTF8String], someString]; NSLog(@"%@", someString); NSLog(@"%@", padded); @cnotethegr8 仅适用于恰好仅包含 7 位 ASCII 字符的字符串。 %s 修饰符不需要 UTF-8 编码的字符串。【参考方案2】:

第二列什么会排成一列?

鉴于您在 ios 上,使用 html 或表格视图将比尝试将字符与空格对齐要简单得多。除了在编程上更优雅之外,它还会看起来更好,更能适应输入数据随时间的变化,并提供更符合平台预期的用户体验。

如果你真的想要使用空格,那么你将不得不将你的 UI 限制为等宽字体(在特定上下文之外,为了便于阅读,比如源代码,这很难看)并且国际字符是会有点痛。

从那里开始,获取字符串长度(请记住,“长度”在某些语言中不一定表示“字符数”),做一些数学运算,使用substringWithRange: 并附加结果的空格。

【讨论】:

【参考方案3】:

不幸的是,Objective-C 不允许 %@ 使用格式说明符。填充的解决方法如下:

NSString *padded = [NSString stringWithFormat:@"%@%*s", someString, 12-someString.length, ""];

这将用空格填充字符串右侧,字段长度最多为 12 个字符。

【讨论】:

这种方法效果很好。 %-10s-UTFString 仅适用于 ASCII 字符串。遇到 CJK 或者其他 unicode chars 会很奇怪。【参考方案4】:

%-@ 不起作用,但 %-s 起作用

NSString *x = [NSString stringWithFormat:@"%-3@", @"a" ];
NSString *y = [NSString stringWithFormat:@"%-3@", @"abcd" ];
NSString *z = [NSString stringWithFormat:@"%-3@ %@", @"a", @"bc" ];
NSString *zz = [NSString stringWithFormat:@"%-3s %@", "a", @"bc" ];
NSLog(@"[%@][%@][%@][%@].......", x,y,z,zz);

输出: [a][abcd][a bc][a bc].......

【讨论】:

【参考方案5】:

试试下面。它对我有用。

NSString *someString = @"1234";
NSString *padded = [someString stringByPaddingToLength: 16 withString: @"x" startingAtIndex:0];

NSLog(@"%@", someString);
NSLog(@"%@", padded);

【讨论】:

【参考方案6】:

首先,你这样做很糟糕。请为您的两列使用单独的标签,然后您也可以使用比例字体。按照你的做法,你应该寻找一个 iPhone 诅咒库。

如果你真的必须这样做,只需使用 stringWithFormat:,比如:

NSString *secondColumnString = @"xxx";
NSString *spacedOutString = [NSString stringWithFormat:@"testingColOne  %@", secondColumnString];
NSString *spacedOutString = [NSString stringWithFormat:@"testingAgain   %@", secondColumnString];

【讨论】:

在添加代码之前,您的回答很好。这并不能解决 OP 的具体问题...... 如何不右填充字符串?如果您一个接一个地打印 spacedOutString 的两个内容,它们将对齐。 因为 (a) 他的字符串是可变长度的,因此,硬编码的间距是行不通的,并且 (b) 他也需要截断字符串。 不同意,硬编码的间距是问题的全部 - “右填充到 12 的列宽” 你在正确的轨道上; +stringWithFormat: 是适合这项工作的工具。

以上是关于正确填充 NSString 的 Objective-c 代码?的主要内容,如果未能解决你的问题,请参考以下文章

在objective-c中从“JSON-style” NSString中获取正确的值

Objective-C 使用 NSDictionary 的实例填充表视图

如何解析数据,如果它是Objective c中的`isKindOfClass([NSString] class)`

在objective-c中归档对象内的对象

Objective-C NSString 引用类型

来自 NSString 的 Objective-C 标识符