UITextField十进制输入有效性校验:如何限制仅输入一个小数点
UITextField 十进制输入单小数点限制实现
你现有的代码已经完成了非法字符过滤的基础逻辑,仅需要补充小数点数量校验即可,修改后的完整代码如下:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if textField == areaTextField { // 原有逻辑:仅允许输入数字和小数点 guard CharacterSet(charactersIn: "0123456789.").isSuperset(of: CharacterSet(charactersIn: string)) else { return false } // 新增逻辑:校验小数点总数不超过1个 let currentText = textField.text ?? "" let finalText = (currentText as NSString).replacingCharacters(in: range, with: string) let dotNumber = finalText.filter { $0 == "." }.count guard dotNumber <= 1 else { return false } // 可选拓展:如果需要限制小数点后位数,比如保留2位小数,可新增以下逻辑 /* if let dotIndex = finalText.firstIndex(of: ".") { let decimalLength = finalText.distance(from: dotIndex, to: finalText.endIndex) - 1 guard decimalLength <= 2 else { return false } } */ } return true }
核心校验逻辑说明:
- 先将输入框原有内容和本次输入的字符串拼接,得到输入完成后的完整文本
- 统计完整文本中小数点的总数量,只要超过1个就直接拦截本次输入
- 逻辑兼容全选替换、中间插入、末尾追加等所有输入场景,不会出现判断偏差
内容的提问来源于stack exchange,提问作者vrao
相关产品推荐
相关产品推荐

