UITextField数字千位分隔格式化问题:波斯语键盘无效果
解决波斯语键盘下UITextField数字千位分隔失效的问题
我来帮你排查并搞定这个问题!你的代码在英文键盘正常,但切换到波斯语键盘就失效,核心是两个容易忽略的细节:
问题根源
- 波斯数字无法被
Int()解析:波斯语键盘输入的是波斯数字(۰、۱、۲...۹),而Swift的Int默认只能识别阿拉伯数字(0-9),所以Int(text)会返回nil,导致后续格式化代码根本没执行。 - 未处理波斯语的分隔符:波斯语里的千位分隔符是
،(和英文逗号是不同的Unicode字符),你的代码只移除了英文的,和.,没处理波斯语分隔符,会导致输入内容混乱。
解决方案
我们需要做两步处理:把波斯数字转成阿拉伯数字用于解析,同时配置NumberFormatter适配波斯语区域,让格式化结果符合波斯语用户的使用习惯。
1. 先写一个波斯数字转阿拉伯数字的工具函数
func convertPersianDigitsToArabic(_ text: String) -> String { let persianDigitMap: [Character: Character] = [ "۰": "0", "۱": "1", "۲": "2", "۳": "3", "۴": "4", "۵": "5", "۶": "6", "۷": "7", "۸": "8", "۹": "9" ] return String(text.map { persianDigitMap[$0] ?? $0 }) }
2. 修改你的textFieldDidChange函数
@objc func textFieldDidChange(textField: UITextField) { guard textField == self.mainTextField, let originalText = textField.text else { return } // 移除所有类型的分隔符:英文逗号、英文点、波斯语逗号 var cleanedText = originalText .replacingOccurrences(of: ",", with: "") .replacingOccurrences(of: ".", with: "") .replacingOccurrences(of: "،", with: "") // 将波斯数字转换为阿拉伯数字,确保Int能正确解析 cleanedText = convertPersianDigitsToArabic(cleanedText) // 配置NumberFormatter为波斯语(伊朗)区域 let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal numberFormatter.locale = Locale(identifier: "fa_IR") // 关键:设置波斯语区域 if let number = Int(cleanedText) { // 格式化后会自动输出波斯数字+波斯千位分隔符,符合用户输入习惯 textField.text = numberFormatter.string(from: NSNumber(value: number)) } }
额外提醒
- 如果你需要保持阿拉伯数字的千位分隔(不转成波斯数字),只需要把
numberFormatter.locale改成Locale(identifier: "en_US")即可。 - 注意你
viewDidLoad的拼写错误:你写的是viewdidload(),正确的应该是viewDidLoad()(驼峰命名,首字母大写),这个小错误也可能导致事件绑定失效!
内容的提问来源于stack exchange,提问作者mdehghani
相关产品推荐
相关产品推荐

