【发布时间】:2016-03-04 08:46:25
【问题描述】:
这似乎是一个超级基本的问题,但我似乎无法在任何地方找到答案 :-( 我可以在 Objective C 中做到这一点,但我在 Swift 中陷入困境。
我需要做什么:
- 取一个整数值
- 将其格式化为本地化字符串
- 使用
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