You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift使用.formatted API格式化UnitLength距离时避免显示斯堪的纳维亚英里

解决方案

你遇到的问题是因为.usage(.road)参数会自动适配当前地区的道路常用单位,瑞典等斯堪的纳维亚地区的道路单位默认包含斯堪的纳维亚英里(mil),所以会自动触发单位转换。
要实现强制仅输出千米或英里,只需要取消自动单位适配,显式指定需要使用的单位即可,具体实现代码如下:

第一步:扩展Measurement增加自定义格式化方法

import Foundation

extension Measurement where UnitType == UnitLength {
    func standardRoadDistanceFormatted(locale: Locale) -> String {
        // 根据地区判断使用英里还是千米
        let targetUnit: UnitLength
        switch locale.measurementSystem {
        case .imperial, .uk:
            targetUnit = .miles
        default:
            targetUnit = .kilometers
        }
        // 转换到目标单位
        let convertedMeasurement = converted(to: targetUnit)
        // 格式化时指定使用当前提供的单位,禁止系统自动替换单位
        return convertedMeasurement.formatted(.measurement(
            width: .abbreviated,
            unit: .provided
        ).locale(locale))
    }
}

第二步:替换原有格式化代码

把原来的.formatted(.measurement(width: .abbreviated, usage: .road).locale(locale))替换为调用上面的扩展方法即可:

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.standardRoadDistanceFormatted(locale: locale))
            Text(distance2.standardRoadDistanceFormatted(locale: locale))
        }
    }
}

效果验证

修改后在瑞典语(sv_SE)环境下,大于10km的距离也会保持xx.x km的格式,不会自动转换为斯堪的纳维亚英里,同时英制地区依然会正常显示英里格式。

内容的提问来源于stack exchange,提问作者Magnus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:06:04