将距离测量格式设置为千米或英制英里,而不是公制英里

Format distance measurement as either kilometers or imperial miles, not metric miles

我正在尝试以公里或英里为单位格式化 Measurement<UnitLength>,但如果度量单位为 > 10 km 并且区域设置合适,则不会 Scandinavian miles

我想使用 Swift 和 Foundation 的新 .formatted API 但没有找到合适的文档来调整单位样式。

简而言之,我想像下面的例子一样展示距离:

我在 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()
    }
}

此代码生成以下内容:

.general 而不是 .road 将根据区域设置为您提供千米或英里。 .asProvided 将为您提供原始测量中定义的单位。

我认为 .general 让你最接近你想要的,尽管它最终可能会给你非公里范围值的米或码。