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

如何格式化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:15:35