使用NumberFormatter转十进制字符串返回nil,求多语言兼容解决方案
解决NumberFormatter解析十进制字符串返回nil及多地区兼容问题
原代码返回nil的原因
默认NumberFormatter实例的numberStyle属性为.none,该样式无法解析任何格式化数字字符串(包括"12.5"这类普通十进制格式),因此返回nil。
基础修复:设置正确的数字样式
只需将numberStyle设为.decimal,即可解析标准十进制字符串:
let decimalString: String = "12.5" let formatter = NumberFormatter() formatter.numberStyle = .decimal let number = formatter.number(from: decimalString) print(number) // 输出Optional(12.5)
兼容任意地区的数字格式
要支持不同地区的数字表示(如阿拉伯-Indic数字"١٢٫٥"、欧洲格式"12,5"),需补充以下配置并结合多locale解析逻辑:
封装兼容多地区的解析方法
func parseDecimalInput(_ inputString: String) -> NSNumber? { let formatter = NumberFormatter() formatter.numberStyle = .decimal formatter.lenient = true // 启用宽松解析,兼容格式差异 // 优先用当前系统locale解析(适配decimalPad默认输入格式) formatter.locale = .autoupdatingCurrent if let validNumber = formatter.number(from: inputString) { return validNumber } // 尝试阿拉伯地区locale(支持阿拉伯-Indic数字) formatter.locale = Locale(identifier: "ar_SA") if let validNumber = formatter.number(from: inputString) { return validNumber } // 尝试欧洲地区locale(逗号作为小数点分隔符) formatter.locale = Locale(identifier: "fr_FR") if let validNumber = formatter.number(from: inputString) { return validNumber } return nil }
测试示例
// 测试不同地区格式的字符串 let testInputs = ["12.5", "١٢٫٥", "12,5"] for input in testInputs { if let number = parseDecimalInput(input) { print("\(input) 解析结果:\(number.doubleValue)") } else { print("\(input) 解析失败") } }
UITextField输入处理建议
对于键盘类型为.decimalPad的UITextField:
- 在
textFieldDidEndEditing代理方法中调用上述解析方法,将输入字符串转换为NSNumber - 系统decimalPad会跟随当前locale输出对应格式的数字,因此优先用
.autoupdatingCurrentlocale解析即可覆盖绝大多数常规输入场景 - 多locale尝试逻辑可兼容用户手动输入的其他地区数字格式
关键配置说明
numberStyle = .decimal:核心配置,指定formatter解析十进制数字格式lenient = true:允许忽略格式细微差异,提升跨地区解析兼容性- 多locale尝试:覆盖不同地区的数字符号(小数点、数字字符)规则,确保常见非本地格式能被解析
内容的提问来源于stack exchange,提问作者alobaili
相关产品推荐
相关产品推荐

