【问题标题】:Format distance measurement as either kilometers or imperial miles, not metric miles将距离测量格式设置为公里或英制英里,而不是公制英里
【发布时间】: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()
    }
}

此代码生成以下内容:

【问题讨论】:

  • 我不知道斯堪的纳维亚英里。我也不知道有一个新的.formatted API。这与现有的 LengthFormatter 类分开吗?当您选择瑞典地区时,它会为您提供斯堪的纳维亚里程?
  • @DuncanC 新的.formatted API 的文档还不是很好,但您可以在developer.apple.com/videos/play/wwdc2021/10109 观看来自 WWDC 21 的视频 - 向前跳至 14:30。
  • @DuncanC 我在我的问题中添加了示例代码,但我不想更改用户的语言环境以删除“斯堪的纳维亚 mil(e)”,这就是我问的原因。谢谢!

标签: swift formatting foundation measurement


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多