如何在Swift中使用appendFormat格式化字符串?

10
我想使用appendFormat将字符串追加到NSMutableString中,并插入空格以使字符串达到最小长度。 在Objective-C中,我只是使用了:
[text.mutableString appendFormat:@"%-12s", "MyString"];

而我会得到

"MyString    "

但在Swift中,我尝试了

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

我得到了一切,但不是"MyString "。出现了一些我不知道来源的随机字符。

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

谢谢大家!


我可以在 Playground 中重现这个问题,每次运行代码时随机字符都会改变。使用 str += String(format:"%-12s", "Hello") 和其它变体。 - Adam S
4个回答

5
通过Ken的解释,Swift字符串对象与Objective-C C风格字符串(以null结尾的char数组)不等价,我发现this answer,其中显示如何将Swift字符串对象转换为C字符串,在其中%-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)

5
你应该使用字符串的方法 stringByPaddingToLength(),用法如下:
let anyString = "MyString"
let padedString = anyString.stringByPaddingToLength(12, withString: " ", startingAtIndex: 0)  // "MyString    "

这个方法也很好用,我在我的回答中添加了一个使用这种方法的示例。这样更加明显(而使用cstring转换则需要注释来解释正在发生的事情)。 - Adam S
在Swift 5中,方法名称已更改为padding(toLength:withPad:startingAt:) - Jerry Krinock

2

尝试:

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

在Swift中,"MyString"是一个String对象。使用%s格式说明符会导致appendFormat()将其参数解释为C风格的字符串(由char缓冲区组成,并以null char结尾)。
在Objective-C中,"MyString"仅是这样的C风格字符串。您需要在其前面添加@才能获得NSString对象(@"MyString")。

你说的“什么都没发生”是什么意思?这个语句确实会执行某些操作。Adam 指出,当使用“%@”时,Cocoa 似乎不尊重格式说明符中的字段宽度,这令人失望。这看起来像是 Cocoa 的一个 bug。 - Ken Thomases
谢谢您先生!只有一个补充:据我所知,Swift的String不是对象,而是结构体。 - Sebastian Hojas

1
    let space: Character = " "
    text = "MyString" + String(count: 12, repeatedValue: space)

这将简单地在字符串末尾添加12个空格,而不是填充字符串_至少_到12个字符的最小值。 - Adam S
是的,字符串“ MyString”可能会更改为另一个长度不同的字符串,这就是为什么我需要一些简单的东西来为我完成复杂的工作。 - kobuchi

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