iOS Swift如何实现UITextField粘贴输入时最多保留6位小数的限制
解决方案
原逻辑仅通过返回布尔值限制输入,仅适配逐字符的键盘输入场景,无法处理粘贴时一次性输入多字符的截断需求。你可以改为主动构造合法输入内容后手动赋值给UITextField,再返回false终止系统默认输入行为,即可覆盖所有输入场景。
完整代码
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { guard textField === self.amountView.textField, let text = textField.text, let textRange = Range(range, in: text), let decimalSeparator = NSLocale.current.decimalSeparator else { return true } // 构造替换后的完整待校验文本 let fullText = text.replacingCharacters(in: textRange, with: string) guard !fullText.isEmpty else { textField.text = "" return false } let components = fullText.components(separatedBy: decimalSeparator) let finalText: String if components.count == 1 { // 无小数部分,直接使用完整文本 finalText = fullText } else { // 取整数部分,合并所有小数段后截取前6位 let integerPart = components.first ?? "" let allDecimalContent = components.dropFirst().joined() let trimmedDecimalPart = String(allDecimalContent.prefix(6)) finalText = "\(integerPart)\(decimalSeparator)\(trimmedDecimalPart)" } // 手动赋值最终合法文本 textField.text = finalText // 可选:调整光标位置到输入结束位置,避免光标跳转到末尾 let targetPosition = range.location + string.count if let newPosition = textField.position(from: textField.beginningOfDocument, offset: min(targetPosition, finalText.count)) { textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition) } // 终止系统默认输入逻辑 return false }
逻辑说明
- 覆盖全场景输入:支持逐字符输入、粘贴、选中批量替换等所有输入触发场景
- 自动过滤多余小数点:仅保留第一个小数点,后续小数点会被自动合并到小数部分处理
- 自动截断超长小数:小数部分最多保留6位,无四舍五入逻辑,完全符合需求
- 整数部分无长度限制,适配需求中的大整数输入场景
- 兼容多地区小数点格式:自动适配当前系统地区的小数点分隔符(如逗号、点号)
内容的提问来源于stack exchange,提问作者miki
相关产品推荐
相关产品推荐

