SwiftUI中formatted格式化负摄氏温度显示错误值的技术咨询
问题
我在SwiftUI项目中尝试用文本字段显示WeatherKit的温度,发现一个奇怪的问题:当对-0.31℃使用temp.formatted(.measurement(width: .abbreviated, usage: .weather))格式化时,得到了错误的-33℉,但正摄氏温度格式化完全正常,只有负数会出问题。
我刚开始学SwiftUI,想问问我的代码里有没有明显错误?
代码如下:
let temp = Measurement(value: -0.31, unit: UnitTemperature.celsius) print(temp) print("Current default locale: \(Locale.current)") print("\(temp.formatted(.measurement(width: .abbreviated, usage: .weather)))") print(MeasurementFormatter().string(from: temp)) //this works
输出结果:
-0.31 °C Current default locale: en_US (current) -33°F 31.442°F
解决分析
这不是你的代码写错了,而是FormattedStyle的.weather用法在处理负摄氏温度转华氏时的精度截断bug。
- 当使用
.weather参数时,格式化器会按天气场景的习惯对温度做取整,但负数值的转换逻辑出现了错误:-0.31℃实际等于31.442℉,但.weather格式化错误地把符号和数值的处理搞混,得出了-33℉的错误结果。 - 直接用
MeasurementFormatter().string(from: temp)是正常的,因为它没有应用.weather场景下的特殊截断逻辑。
临时解决办法
如果你需要保留.weather的格式化风格(比如缩写单位、符合天气显示的格式),可以手动创建MeasurementFormatter并配置对应的样式,替代formatted方法:
let formatter = MeasurementFormatter() formatter.unitOptions = .temperatureWithoutUnit formatter.unitStyle = .abbreviated formatter.numberFormatter.maximumFractionDigits = 0 // 按天气习惯取整 formatter.locale = Locale.current print(formatter.string(from: temp)) // 输出正确的31°F
如果不需要取整,调整maximumFractionDigits为合适的位数即可。
内容的提问来源于stack exchange,提问作者Sekar
相关产品推荐
相关产品推荐

