【问题标题】:objective-c code to right pad a NSString?正确填充 NSString 的 Objective-c 代码?
【发布时间】: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 列想起来的。

【问题讨论】:

    标签: iphone objective-c ios nsstring padding


    【解决方案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: 是适合这项工作的工具。
          猜你喜欢
          • 1970-01-01
          • 2012-12-13
          • 2013-01-22
          • 2015-04-01
          • 2012-01-19
          • 2023-03-23
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多