SwiftUI:如何让Text视图使用数字格式时即时显示小数点?
SwiftUI中实现.number格式下小数点即时显示
问题的核心在于:当你输入"10."时,将其转为Double会得到10.0,而.number格式默认不会显示末尾的小数点和零,所以只有输入下一位数字后才会展示小数点。要解决这个问题,我们可以通过判断输入字符串的结尾是否为小数点,针对性处理格式化逻辑,既保留千位分隔符,又能即时显示小数点。
解决方案:自定义格式化逻辑
添加一个计算属性,根据输入字符串的状态返回对应的格式化结果:
struct AddTransaction: View { private enum Constants { static let amountFont = Font.title static let amountFontWeight = Font.Weight.semibold static let padding: CGFloat = 42.0 } @State private var amountString = "0" // 自定义格式化逻辑 private var formattedAmount: String { if amountString.hasSuffix(".") { // 处理小数点结尾的情况:格式化整数部分后拼接小数点 let integerPart = String(amountString.dropLast()) let number = Double(integerPart) ?? 0.0 return number.formatted(.number) + "." } else { // 正常情况使用.number格式 let number = Double(amountString) ?? 0.0 return number.formatted(.number) } } var body: some View { NavigationView { VStack { // 使用自定义格式化后的字符串 Text(formattedAmount) .font(Constants.amountFont) .fontWeight(Constants.amountFontWeight) Spacer() NumberPad(numberString: $amountString) .padding(.horizontal, Constants.padding) } .navigationTitle("Add Transaction") .navigationBarTitleDisplayMode(.inline) } } }
逻辑说明
- 当输入字符串以小数点结尾时(比如
"10."),我们先截取小数点前的部分,用.number格式处理千位分隔符,再手动补上小数点,确保符号即时显示。 - 其他场景下(比如
"100000"或"10.5"),依然使用默认的.number格式,保留千位分隔符和正常的小数显示。 - 边界情况也能处理:比如输入
"."时,会显示"0.",符合用户输入习惯。
内容的提问来源于stack exchange,提问作者Kex
相关产品推荐
相关产品推荐

