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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:14:56