You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:45:15