我有一个通用的 swiftUI 应用程序。在该应用程序中的文本字段中,我只想允许数字和 。 ,还应该在用户键入时使用逗号(,)格式化文本。只允许我使用以下代码获得的数字
TextField(placeholder, text: $text)
// .padding(.leading, isPrefix ? 0 : -10) // Text Field padding
.padding(.horizontal, 12) // Text Field padding
// .padding(.horizontal, 12) // Text Field padding
.font(.arialDisplay(.regular, size: 14))
.foregroundColor(isDarkMode ? .white : .black) // Set text color based on color scheme
.onChange(of: text, perform: { _ in
if text.count > 0 {
// self.isPrefix = true
} else {
// self.isPrefix = false
}
// Callback for editing changes event
// Implement your editing changes logic here
})
.onSubmit {
}
.onReceive(Just(text)) { newValue in
let allowedCharacters = "0123456789.$,"
let filtered = newValue.filter { allowedCharacters.contains($0) }
if filtered != newValue {
self.text = filtered
}
}
我使用以下代码实现了逗号格式: @State私有变量值= 0.0 //...
文本字段(“值”, 值:$值, 格式:.数字 .分组(.自动) .精度(.fractionLength(2) )
当我应用格式化程序时,它破坏了我仅使用数字的逻辑。由于应用程序也适用于 ipad,所以我不能依赖设置键盘类型。如何在用户键入时使用 格式化文本并仅允许数字和点?。对于前任。 250000 应显示为 250,000。任何帮助将不胜感激。
这是格式化数字并仅允许数字、点、逗号和美元的组合解决方案。当我组合解决方案时,只有格式化有效,只有数字的解决方案不起作用
导入 SwiftUI 进口联合收割机 扩展字符串 { func toDouble() -> 双精度? { 返回 NumberFormatter().number(from: self)?.doubleValue } }
构造解决方案2:查看{
@State private var text: Double = 0
var body: some View {
TextField("",value: $text, format: .currency(code: Locale.current.currency?.identifier ?? "USD"))
.onChange(of: text, perform: { newValue in
})
.onReceive(Just(text)) { newValue in
let newString: String = String(format: "%f", newValue)
let allowedCharacters = "0123456789.$,"
let filtered = newString.filter { allowedCharacters.contains($0) }
if filtered != newString {
self.text = filtered.toDouble() ?? 0
}
}
}
}
无需使用可用的工具重新发明轮子,
TextField
有一个构造函数,它采用数字属性和格式,可以自动为您格式化内容。
即使它不能 100% 满足您的要求,我仍然相信使用它比编写大量自定义代码更好。
这是一个示例,在用户区域设置中使用千位分隔符和 2 个小数位来格式化输入的数字
编辑 - 修复了 TextField 语法的问题。
@State private var value = 0.0
//...
TextField("Value",
value: $value,
format: .number
.grouping(.automatic)
.precision(.fractionLength(2)
))
let formatter: NumberFormatter = {let formatter = NumberFormatter() formatter.numberStyle = .decimal return formatter }()
请添加以上格式化程序
并通过
使用此格式化程序TextField("placeholder", value: $text, formatter: formatted)