iOS/Swift:如何校验TextField输入内容为Double类型?
实现经纬度输入的Double有效性校验
嘿,针对你的需求,我来分享几个实用的方案——不仅能校验输入是否是合法的Double类型,还能结合经纬度的范围做针对性校验,让输入更严谨!
1. 基础Double有效性校验函数
先写一个通用函数,用来判断输入的字符串能否转换为有效的Double:
func isValidDouble(_ input: String) -> Bool { // 空字符串直接返回无效 guard !input.isEmpty else { return false } // 尝试将字符串转为Double,成功则有效 return Double(input) != nil }
这个函数能自动拦截像"12.34.56"(多个小数点)、"--90"(多个破折号)这类格式错误的输入,因为这些字符串无法被解析为Double。
2. 针对经纬度的范围校验
既然是纬度和经度输入,光转成Double还不够,还要符合地理范围:
- 纬度范围:-90.0 ~ 90.0
- 经度范围:-180.0 ~ 180.0
我们可以基于基础校验,写两个针对性的函数:
// 校验纬度有效性 func isValidLatitude(_ input: String) -> Bool { guard let latitude = Double(input) else { return false } return latitude >= -90.0 && latitude <= 90.0 } // 校验经度有效性 func isValidLongitude(_ input: String) -> Bool { guard let longitude = Double(input) else { return false } return longitude >= -180.0 && longitude <= 180.0 }
3. 在哪里触发校验?
推荐在用户结束输入时(比如收起键盘)或者点击提交按钮时触发校验,给用户明确的反馈:
示例:在textFieldDidEndEditing中校验
func textFieldDidEndEditing(_ textField: UITextField) { guard let inputText = textField.text else { return } // 根据输入框区分纬度/经度校验 if textField == yourLatitudeTextField { // 替换成你的纬度输入框实例 if !isValidLatitude(inputText) { showInvalidInputAlert(title: "无效纬度", message: "请输入-90到90之间的有效数值") textField.text = "" textField.becomeFirstResponder() // 让输入框重新获得焦点,方便修正 } } else if textField == yourLongitudeTextField { // 替换成你的经度输入框实例 if !isValidLongitude(inputText) { showInvalidInputAlert(title: "无效经度", message: "请输入-180到180之间的有效数值") textField.text = "" textField.becomeFirstResponder() } } } // 封装一个弹窗提示的辅助函数 private func showInvalidInputAlert(title: String, message: String) { let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) present(alert, animated: true) }
4. 进阶:提前限制输入格式(可选)
你现有的字符限制已经过滤了非法字符,但还可以在shouldChangeCharactersIn里补充规则,提前避免无效格式:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let allowedCharacters = "0123456789-." let cs = NSCharacterSet(charactersIn: allowedCharacters).inverted let filtered = string.components(separatedBy: cs).joined(separator: "") guard string == filtered else { return false } // 限制只能输入一个小数点 if string == "." { if let text = textField.text, text.contains(".") { return false } } // 限制破折号只能在开头,且只能有一个 if string == "-" { if let text = textField.text, !text.isEmpty { return false } } return true }
这样用户就无法输入多个小数点、中间加破折号这类无效格式,后续的校验压力也会小很多!
内容的提问来源于stack exchange,提问作者RochNoure
相关产品推荐
相关产品推荐

