如何格式化UITextField中数学算式字符串内的数字?
解决UITextField算式中数字的格式化问题
核心思路
把带运算符的算式拆分成「数字段」和「运算符段」,单独对每个数字段用你的NSNumberFormatter格式化,再重新拼接成完整算式。
具体实现步骤
1. 准备格式化工具和运算符集合
复用你已有的数字格式化器,同时定义需要支持的运算符:
// 复用你已有的数字格式化器,示例配置可按需修改 let numberFormatter: NumberFormatter = { let formatter = NumberFormatter() formatter.numberStyle = .decimal formatter.minimumFractionDigits = 0 formatter.maximumFractionDigits = 2 formatter.locale = Locale.current return formatter }() // 定义支持的运算符,可根据需求扩展 let operators: Set<Character> = ["+", "-", "*", "/"]
2. 实现算式拆分与重组方法
写一个函数,拆分输入的算式字符串,格式化数字后重新拼接:
func formatExpression(_ input: String) -> String { var components: [String] = [] var currentNumber = "" for char in input { if operators.contains(char) { // 先处理当前累积的数字 if !currentNumber.isEmpty { if let number = Double(currentNumber), let formatted = numberFormatter.string(from: NSNumber(value: number)) { components.append(formatted) } else { // 无效数字直接保留原内容 components.append(currentNumber) } currentNumber = "" } // 添加运算符 components.append(String(char)) } else { // 累积数字字符(包括小数点) currentNumber.append(char) } } // 处理最后一段数字 if !currentNumber.isEmpty { if let number = Double(currentNumber), let formatted = numberFormatter.string(from: NSNumber(value: number)) { components.append(formatted) } else { components.append(currentNumber) } } // 拼接成最终字符串 return components.joined() }
3. 在UITextField代理中应用格式化
在输入回调里实时处理并更新格式化后的内容:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { guard let currentText = textField.text else { return true } let newText = (currentText as NSString).replacingCharacters(in: range, with: string) // 应用格式化逻辑 let formattedText = formatExpression(newText) // 直接设置文本,返回false阻止默认输入行为 textField.text = formattedText return false }
注意事项
- 如果需要支持负数,要调整拆分逻辑,比如区分运算符和负号(如
-123+456中的-是负号而非运算符) - 可添加连续运算符过滤逻辑,避免用户输入
12++34这类无效内容 - 若你的格式化器有特殊配置(如货币、百分比),直接替换
numberFormatter的设置即可
内容的提问来源于stack exchange,提问作者artexhibit
相关产品推荐
相关产品推荐

