【问题标题】:In Swift, how to insert formatted Int value into String?在 Swift 中,如何将格式化的 Int 值插入到 String 中?
【发布时间】:2016-03-04 08:46:25
【问题描述】:

这似乎是一个超级基本的问题,但我似乎无法在任何地方找到答案 :-( 我可以在 Objective C 中做到这一点,但我在 Swift 中陷入困境。

我需要做什么:

  1. 取一个整数值
  2. 将其格式化为本地化字符串
  3. 使用stringWithFormat等效方法将值注入另一个字符串(因为另一个字符串也已本地化,以下简化示例中未显示)

如何在 Objective C 中轻松完成——这很有效:

    // points is of type NSNumber *

    NSNumberFormatter *formatter = [NSNumberFormatter new];
    formatter.locale             = [NSLocale currentLocale];
    formatter.numberStyle        = NSNumberFormatterDecimalStyle;

    NSString *ptsString = [formatter stringFromNumber:points];
    NSString *message   = [NSString stringWithFormat:@"You've earned %@ points", ptsString];

我在 Swift 中的最佳尝试——最后一行出现编译器错误:

    // points is of type Int

    let formatter         = NSNumberFormatter()
    formatter.locale      = NSLocale.currentLocale()
    formatter.numberStyle = NSNumberFormatterStyle.DecimalStyle

    let ptsString = formatter.stringFromNumber(points)!
    let message   = String(format: "You've earned %@ points", arguments: ptsString)

我在 Xcode 的最后一行收到以下错误:

"Cannot convert value of type 'String' to expected argument type '[CVarArgType]'"

(在我的实际代码中,我想要在其中插入点值的消息本身也是本地化的,但我已经简化了这个示例,因为在这两种情况下我都会遇到完全相同的错误。)

我在这里错过了什么..?

非常感谢您的帮助,

埃里克

【问题讨论】:

  • 这确实很基本。请阅读 Swift 语言指南中的Strings and Characters 章节,字符串插值
  • 谢谢。正在阅读...
  • 啊,是的,我知道。我应该在我的问题中澄清我不能使用字符串插值,因为其中带有 %@ 的消息实际上是本地化的,翻译成 8 种不同的语言。
  • 你快到了。在这一行let message = String(format: "You've earned %@ points", arguments: ptsString),只需删除arguments:...即应该是let message = String(format: "You've earned %@ points", ptsString)
  • 只是为了澄清 - 如果您使用带有 arguments 参数的字符串格式初始值设定项,那么您需要将其包装在一个数组中。如果省略 arguments 参数,则不需要将其包装在数组中。原因是参数有两个初始化器 - 一个接受 CVarArgType 数组,另一个接受可变参数。通过指定 arguments 参数,您正在尝试使用需要数组的初始化程序。

标签: ios string swift nsnumberformatter stringwithformat


【解决方案1】:

您需要将参数包装在一个集合中。像这样:

let message   = String(format: "You've earned %@ points", arguments: [ptsString])

你也可以用这个方法:

let message   = "You've earned \(ptsString) points"

此外,您可以创建一个扩展方法来执行此操作:

extension String {
    func format(parameters: CVarArgType...) -> String {
        return String(format: self, arguments: parameters)
    }
}

现在你可以这样做了:

let message = "You've earned %@ points".format("test")
let message2params = "You've earned %@ points %@".format("test1", "test2")

【讨论】:

  • 啊,谢谢!确实将它包装在一个集合中解决了这个问题:String(format: "You've earned %@ points", arguments: [ptsString])。在这种情况下,为什么有必要这样做?从我在网上看到的其他示例中,我没有看到参数变量周围的 [] 括号......
  • 您不需要将参数包装到数组中,请参阅 Anton 对问题的评论。
  • 太棒了!感谢大家的超快速响应。哇...非常感谢!
【解决方案2】:

有时,您需要更多控制 - 所以如果您需要前导零,您可以像在 Objective-C 中一样使用 'stringWithFormat'

let ptsString = String(format: "%02d", points)

【讨论】:

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