如何将Measurement对象的数值格式化为保留1位小数?
解决Measurement对象保留1位小数并显示单位的问题
你可以通过Measurement.FormatStyle的numberFormat修饰符精确控制小数位数,同时自动处理单位的本地化转换与显示,比手动字符串插值更可靠、代码更简洁。
核心实现思路
利用FormatStyle链式调用,在.measurement()样式后添加.numberFormat配置,指定小数的最大和最小位数为1,既强制显示1位小数,又保留单位的本地化描述。
修改后的示例代码
struct MeasurementView: View { let reportedTemperature = Measurement(value: 50.123, unit: UnitTemperature.celsius) let myLocale = Locale.autoupdatingCurrent var body: some View { VStack(spacing: 12) { // 1. 缩写单位 + 1位小数(自动适配Locale单位) Text(reportedTemperature.formatted( .measurement(width: .abbreviated) .numberFormat(.number.precision(.fractionLength(1))) )) // 2. 完整单位名称 + 1位小数 Text(reportedTemperature.formatted( .measurement(width: .wide) .numberFormat(.number.precision(.fractionLength(1))) )) // 3. 窄格式(符号化单位)+ 1位小数 Text(reportedTemperature.formatted( .measurement(width: .narrow) .numberFormat(.number.precision(.fractionLength(1))) )) // 4. 手动指定Locale的场景(比如强制显示华氏度) Text(reportedTemperature.formatted( .measurement(width: .wide) .numberFormat(.number.precision(.fractionLength(1))) .locale(Locale(identifier: "en_US")) )) } } }
关键细节说明
.fractionLength(1):同时设置最小和最大小数位数为1,无论原始数值小数位数多少,统一显示1位(如50.123显示为50.1,50显示为50.0)。若允许整数情况不显示小数,可改用.fractionLength(0...1)。- 自动单位转换:
formatted方法会根据当前Locale自动转换温度单位(如英文系统转华氏度,中文系统保留摄氏度),无需手动调用converted(to:)。 - 单位本地化风格:
.abbreviated:缩写形式(如"°F"、"°C").wide:完整名称(如"degrees Fahrenheit"、"摄氏度").narrow:符号化最简形式(如"°")
对比手动插值的优势
- 无需手动拼接单位字符串,避免本地化适配错误
- 自动处理单位转换,不用手动适配Locale调用
converted(to:) - 遵循Apple格式化规范,边缘场景(极端数值、不同Locale单位规则)处理更可靠
内容的提问来源于stack exchange,提问作者JohnSF
相关产品推荐
相关产品推荐

