假设我已经从 API 下载了这个数据列表:
[
"Anita",
"Jean",
"Peter"
]
我想以自然句子格式列出这些数据。例如,在美国英语中,这个字符串应该显示给用户:
Anita, Jean, and Peter
但是,如果用户是瑞典人,他们应该看到这个字符串:
Anita, Jean och Peter
请注意,牛津逗号丢失了,瑞典语使用不同的词来表示“and”,这是瑞典用户希望看到的。如何以尊重用户所在地的自然语言方式格式化这些数据?可以有可变数量的数据,不一定只有 3 个项目。我的直觉是子类化 Formatter
/NSFormatter
,但我想以一种可以轻松扩展它以支持我不会说的语言的方式构建它,所以我想知道是否有我无法在搜索中找到的 iOS 标准或第 3 方格式化程序
最佳答案
从 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")
如果需要,您还可以设置 itemFormatter
您的 ListFormatter
实例的属性具有专门的格式化程序类型:
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")
关于ios - 本地化自然格式的 API 数据列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55696180/