使用NumberFormatter时删除文本框美元符号导致值存为0的问题
问题解决:SwiftUI TextField货币输入删除符号后值变为0.00
问题场景
用SwiftUI的TextField结合NumberFormatter处理货币金额输入,输入框初始显示$0.00,但删除美元符号后,绑定的amount值会被自动设为0.00,无法正确识别无符号的数值输入。
原代码如下:
NumberFormatter配置
var formatter: NumberFormatter{ let formatter = NumberFormatter() formatter.numberStyle = .currency return formatter }
TextField代码
TextField("Amount of regular paycheck", value: $amount, formatter: formatter) .keyboardType(.decimalPad) .background(Color.white) .textFieldStyle(.roundedBorder)
问题原因
默认的.currency样式NumberFormatter对输入格式要求严格,必须包含对应区域的货币符号才能正确解析数值。删除美元符号后解析失败,会返回默认值0,导致绑定变量被重置。
解决方案
调整NumberFormatter配置,开启宽松解析模式并明确格式规则,让它既能识别带货币符号的输入,也能处理纯数字输入:
修改后的NumberFormatter配置:
var formatter: NumberFormatter{ let formatter = NumberFormatter() formatter.numberStyle = .currency // 开启宽松解析,允许输入不带货币符号的纯数字金额 formatter.isLenient = true // 固定小数位数为2位,符合货币格式规范 formatter.minimumFractionDigits = 2 formatter.maximumFractionDigits = 2 // 指定区域确保货币符号和格式统一(可选,根据需求调整) formatter.locale = Locale(identifier: "en_US_POSIX") return formatter }
补充说明
isLenient = true是核心设置,让解析器不再强制要求输入包含货币符号,能正确识别纯数字金额。- 固定小数位数可以保证输入始终符合货币格式,避免出现小数位数异常的情况。
- 如果需要跟随系统区域的货币设置,可以去掉
locale配置行。
内容的提问来源于stack exchange,提问作者NekNek
相关产品推荐
相关产品推荐

