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

在Swift中如何给UITextField设置0-1000000的输入金额限制

现有代码的问题

  • 判断逻辑基于输入修改前的文本内容,没有计算用户输入完成后最终的文本值,永远慢一步:输入超过1000000的那次操作不会被拦截,反而下次输入才会被拦截
  • 强制解包textField.text,文本为空时会直接崩溃
  • 没有过滤非数字输入,用户输入字母、符号等非法字符时,Int构造会直接失败,逻辑直接放行
  • 没有覆盖数值下限逻辑,用户可以输入负数
  • 没有考虑金额常见的小数场景(如果需求是整数金额可忽略这条)

整数金额场景(仅允许输入0~1000000的整数)

实现代码如下:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // 放行退格操作
    guard !string.isEmpty else { return true }
    // 计算修改后的完整文本
    let originText = textField.text ?? ""
    let finalText = (originText as NSString).replacingCharacters(in: range, with: string)
    // 仅允许输入数字
    let allowedSet = CharacterSet.decimalDigits
    guard string.rangeOfCharacter(from: allowedSet.inverted) == nil else {
        return false
    }
    // 转换为整数判断范围
    guard let amount = Int(finalText) else {
        return false
    }
    return amount >= 0 && amount <= 1000000
}

带小数的金额场景(允许最多两位小数,0~1000000范围)

如果需要支持小数金额,用下面的实现:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // 放行退格操作
    guard !string.isEmpty else { return true }
    let originText = textField.text ?? ""
    let finalText = (originText as NSString).replacingCharacters(in: range, with: string)
    
    // 允许输入数字和小数点
    let allowedSet = CharacterSet(charactersIn: "0123456789.")
    guard string.rangeOfCharacter(from: allowedSet.inverted) == nil else {
        return false
    }
    
    // 限制只能有一个小数点
    let dotCount = finalText.components(separatedBy: ".").count - 1
    guard dotCount <= 1 else {
        return false
    }
    
    // 限制小数最多两位
    if let dotIndex = finalText.firstIndex(of: ".") {
        let decimalLength = finalText.distance(from: dotIndex, to: finalText.endIndex) - 1
        guard decimalLength <= 2 else {
            return false
        }
    }
    
    // 转换为浮点数判断范围
    guard let amount = Double(finalText) else {
        return false
    }
    return amount >= 0 && amount <= 1000000
}

内容的提问来源于stack exchange,提问作者Ashwani Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:48:05