说我已经从API下载了此数据列表:
[
"Anita",
"Jean",
"Peter"
]
我想以自然的句法格式列出这些数据。例如,以美式英语,该字符串应显示给用户:
Anita, Jean, and Peter
但是,例如,如果用户是瑞典人,则他们应该看到以下字符串:
Anita, Jean och Peter
请注意,缺少牛津逗号,并且瑞典语将“ and”使用不同的词,这是瑞典语用户期望看到的。如何以一种尊重用户所在位置的自然语言格式设置数据格式?可以有可变数量的数据,不一定只有3个项目。我的直觉是继承Formatter
/ NSFormatter
的子类,但我想以一种可以轻松扩展它以支持我不会说的语言的方式来构建它,所以我想知道是否存在我在搜索中找不到的iOS标准或第三方格式化程序
答案 0 :(得分:1)
在以前的iOS版本中,此问题仍未解决,如果您有答案,我将不胜感激。但是,iOS 13公开了NSListFormatter
,可用于执行此操作。例如:
迅速:
ListFormatter().localizedString(byJoining: ["Anita", "Jean", "Peter"])
Objective-C:
[[NSListFormatter new] localizedStringByJoiningStrings:@["Anita", "Jean", "Peter"]];
答案 1 :(得分:0)
从iOS 13开始,Foundation具有ListFormatter
类型。根据您的需求,您可以通过多种方式使用它来获取数组的文本表示形式。
使用ListFormatter
的最简单方法是使用其静态localizedString(byJoining:)
方法。以下Swift 5.1 / iOS 13 Playground示例代码显示了如何实现此方法,以便将数组转换为本地化的字符串表示形式:
import Foundation
let array = [
"Anita",
"Jean",
"Peter"
]
let string = ListFormatter.localizedString(byJoining: array)
print(string) // prints: Anita, Jean, and Peter (for en_US locale)
作为localizedString(byJoining:)
的替代方法,您可以创建ListFormatter
的实例并使用string(from:)
方法。如果您需要为文本表示指定语言环境,这将很有用:
import Foundation
let array = [
"Anita",
"Jean",
"Peter"
]
let listFormatter = ListFormatter()
listFormatter.locale = Locale(identifier: "fr_FR") // set only if necessary
let string = listFormatter.string(from: array)
print(String(describing: string)) // prints: Optional("Anita, Jean et Peter")
如果需要,您还可以使用特殊的格式化程序类型设置ListFormatter
实例的itemFormatter
属性:
import Foundation
let array = [
55,
112,
8
]
let locale = Locale(identifier: "es_ES") // set only if necessary
let numberFormatter = NumberFormatter()
numberFormatter.locale = locale
numberFormatter.numberStyle = NumberFormatter.Style.spellOut
let listFormatter = ListFormatter()
listFormatter.locale = locale
listFormatter.itemFormatter = numberFormatter
let string = listFormatter.string(from: array)
print(String(describing: string)) // prints: Optional("cincuenta y cinco, ciento doce y ocho")