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
相关产品推荐
相关产品推荐

