【问题标题】:How to use appendFormat to format a string in Swift?如何使用 appendFormat 在 Swift 中格式化字符串?
【发布时间】:2015-04-21 03:09:34
【问题描述】:

我想使用 appendFormat 将字符串附加到 NSMutableString,插入空格以获得字符串的最小长度。

在objective-c中,我只是用过

[text.mutableString appendFormat:@"%-12s", "MyString"];

我会得到

"MyString    "

但在 Swift 中,我尝试过

text.mutableString.appendFormat("%-12s", "MyString")

我得到了一切,但不是“MyString”。出现了一些我不知道它来自哪里的随机字符。

有没有人知道为什么会发生这种情况,我应该怎么做?

谢谢你们!

【问题讨论】:

  • 我可以在 Playground 中重现这一点,每次运行代码时随机字符都会发生变化。使用 str += String(format:"%-12s", "Hello") 和变体。

标签: ios xcode swift nsmutablestring


【解决方案1】:

你应该使用String的方法stringByPaddingToLength()如下:

let anyString = "MyString"
let padedString = anyString.stringByPaddingToLength(12, withString: " ", startingAtIndex: 0)  // "MyString    "

【讨论】:

  • 这也很好,在我的答案中添加了一个使用这种方法的示例。它也更加明显(因为 cstring 转换需要注释来解释发生了什么)。
  • 在 Swift 5 中,方法名称已更改为 padding(toLength:withPad:startingAt:)
【解决方案2】:

通过 Ken 的解释,Swift String 对象 等同于 Objective-C C 风格的字符串(char 的空终止数组),我找到了this answer,它显示了如何将 Swift String 对象转换为 Cstring,%-12s 格式可以正常工作。

您可以按如下方式使用现有的格式化字符串:

text.mutableString.appendFormat("%-12s", ("MyString" as NSString).UTF8String)

一些例子:

var str = "Test"
str += String(format:"%-12s", "Hello")
// "Test–yç       " (Test, a dash, 11 random characters)

var str2 = "Test"
str2 += String(format:"%-12@", "Hello")
// "TestHello" (no padding)

var str3 = "Test"
str3 += String(format:"%-12s", ("Hello" as NSString).UTF8String)
// "TestHello       " ('Hello' string is padded out to 12 chars)

【讨论】:

    【解决方案3】:

    试试:

    text.mutableString.appendFormat("%-12@", "MyString")
    

    在 Swift 中,"MyString" 是一个String 对象%s 格式说明符导致 appendFormat() 将其参数解释为 C 样式字符串(char 的缓冲区以空 char 结尾)。

    在 Objective-C 中,"MyString" 就是这样一个 C 风格的字符串。您必须在其前面加上 @ 才能获得 NSString 对象 (@"MyString")。

    【讨论】:

    • “什么都没发生”是什么意思?该语句做了某事。 Adam 指出,在使用%@ 时,Cocoa 似乎不尊重格式说明符中的字段宽度,这令人失望。这似乎是一个 Cocoa 错误。
    • 谢谢先生!只是一个补充:Swift 的 String 不是一个对象,afaik,它是一个结构。
    【解决方案4】:
        let space: Character = " "
        text = "MyString" + String(count: 12, repeatedValue: space)
    

    【讨论】:

    • 这只会在字符串末尾附加 12 个空格,而不是将字符串 填充到至少 12 个字符。
    • 是的,字符串 MyString 可以更改为另一个长度不同的字符串,这就是为什么我需要一些简单的东西来为我完成复杂的工作
    猜你喜欢
    • 2023-03-29
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2016-11-01
    • 2015-11-30
    • 2021-04-02
    相关资源
    最近更新 更多