You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UITextField数字千位分隔格式化问题:波斯语键盘无效果

解决波斯语键盘下UITextField数字千位分隔失效的问题

我来帮你排查并搞定这个问题!你的代码在英文键盘正常,但切换到波斯语键盘就失效,核心是两个容易忽略的细节:

问题根源

  1. 波斯数字无法被Int()解析:波斯语键盘输入的是波斯数字(۰、۱、۲...۹),而Swift的Int默认只能识别阿拉伯数字(0-9),所以Int(text)会返回nil,导致后续格式化代码根本没执行。
  2. 未处理波斯语的分隔符:波斯语里的千位分隔符是،(和英文逗号是不同的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:34:57