在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
相关产品推荐
相关产品推荐

