【发布时间】:2021-12-17 02:57:51
【问题描述】:
我正在尝试以公里或英里为单位格式化 Measurement<UnitLength>,但如果测量值为 > 10 km 并且区域设置合适,则不是 Scandinavian miles。
我想使用 Swift 和 Foundation 的新 .formatted API,但没有找到合适的文档来调整单元样式。
简而言之,我想像下面的例子一样呈现距离:
- 如果以英里为单位显示,请显示
3.5 mi - 如果以公里为单位显示,则显示
7.1 km - 如果以公里为单位显示但超过 10 公里,则显示
13.5 km,现在它显示(在瑞典语言环境中)1.4 mil
我在 SwiftUI 中使用以下代码来格式化距离文本
Text(distance.formatted(.measurement(width: .abbreviated, usage: .road)))
这是我用来显示问题的一些测试代码:
import SwiftUI
struct TestView: View {
@Environment(\.locale) var locale
private let distance1 = Measurement(value: 7.04765, unit: UnitLength.kilometers)
private let distance2 = Measurement(value: 13.4657, unit: UnitLength.kilometers)
var body: some View {
VStack {
Text(distance1.formatted(.measurement(width: .abbreviated, usage: .road).locale(locale)))
Text(distance2.formatted(.measurement(width: .abbreviated, usage: .road).locale(locale)))
}
}
}
struct TestView_Previews: PreviewProvider {
static var previews: some View {
Group {
TestView() // Swedish
.environment(\.locale, .init(identifier: "sv_SE"))
TestView() // American English
.environment(\.locale, .init(identifier: "en_US"))
TestView() // French
.environment(\.locale, .init(identifier: "fr_FR"))
}
.previewLayout(.sizeThatFits)
.padding()
}
}
此代码生成以下内容:
【问题讨论】:
-
我不知道斯堪的纳维亚英里。我也不知道有一个新的
.formattedAPI。这与现有的 LengthFormatter 类分开吗?当您选择瑞典地区时,它会为您提供斯堪的纳维亚里程? -
@DuncanC 新的
.formattedAPI 的文档还不是很好,但您可以在developer.apple.com/videos/play/wwdc2021/10109 观看来自 WWDC 21 的视频 - 向前跳至 14:30。 -
@DuncanC 我在我的问题中添加了示例代码,但我不想更改用户的语言环境以删除“斯堪的纳维亚 mil(e)”,这就是我问的原因。谢谢!
标签: swift formatting foundation measurement