Text显示Double数值
在SwiftUI当中,如果使用Text显示Double数值时:
Text("\(difference)")
Text会显示Double的完整小数点,例如下面的380,000元。

会显示后面6位小数。
因此,可以通过String(format:) 格式化显示 Double 类型的数据,限制其显示的精度到小数点后两位。
Text("\(String(format: "%.2f",difference))")
通过数字格式化的形式,Text可以显示Double数值的后两位。

但是数值格式化后,千分位分隔符也会消失。
因此,如果想要同时保留两位小数和千分位分隔符,可以使用 NumberFormatter。
扩展格式化
创建一个辅助方法或扩展来格式化数字:
import Foundation
extension Double {
func formattedWithTwoDecimalPlaces() -> String {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2
return formatter.string(from: NSNumber(value: self)) ?? "0.00"
}
}
在显示的地方调用这个方法:
Text("\(difference.formattedWithTwoDecimalPlaces())")
在视图中实现了保留两位小数和千分位分隔符的效果:

最终实现了标题所阐述的效果。
代码讲解
import Foundation
extension Double {
func formattedWithTwoDecimalPlaces() -> String {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2
return formatter.string(from: NSNumber(value: self)) ?? "0.00"
}
}
这段代码是一个 Swift 扩展,定义了 Double 类型的新方法 formattedWithTwoDecimalPlaces,用于将一个 Double 数值格式化为具有两位小数的字符串,并支持千分位分隔符。
let formatter = NumberFormatter()
创建一个 NumberFormatter 对象,它是 Foundation 框架中专门用于数字格式化的工具。
formatter.numberStyle = .decimal
设置数字样式为 .decimal,启用千分位分隔符。
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2
maximumFractionDigits = 2:最多保留 2 位小数。
minimumFractionDigits = 2:即使实际数值没有小数,也会填充到 2 位小数。
return formatter.string(from: NSNumber(value: self)) ?? "0.00"
使用 formatter.string(from:) 方法,将当前的 Double 值(self)转换为 NSNumber 并格式化为字符串。
如果格式化失败(返回 nil),则默认返回 “0.00”。
相关文章
SwiftUI格式化数据:https://fangjunyu.com/2024/12/23/swiftui%e6%a0%bc%e5%bc%8f%e5%8c%96%e6%95%b0%e6%8d%ae/