首页 > 解决方案 > 替换基于字符串的数学方程Swift中的无效小数点

问题描述

我正在研究另一种方法来验证 iOS 计算器应用程序上的用户输入。我已经编写了可以转换字符串示例的代码:“9*++8”>“9+8”。该代码接受用户输入的最后一个运算符并删除其余运算符。我知道这可能不是最有效的输入验证方法,但我正在使用它并试图弄清楚。

我的问题是当用户输入“9.9.9+9.9”之类的内容时。理想情况下,我想删除第一次出现小数后出现的所有小数,然后在每次引入数学运算符(+、-、* 等)时重新启动此逻辑。

寻找可以给我“9.9.9+9.9”>“9.99+9.9”的 I/O 的东西

标签: arraysswiftstring

解决方案


有很多方法可以解决这样的问题。

解决此问题的一种方法是定义您自己的语法并将您的输入解析为该语法的一个单词。实现此目的的工具有 yacc、ANTLR 等。但我假设您正在寻找更简单的解决方案。

另一种方法是定义一个合适的正则表达式来匹配所有额外的小数并删除它们。

但是对于您描述的这种特殊情况,您可以通过对字符串的直接迭代来解决它。伪代码如下:

isbehindDecimal = false
tokens = []
digits = ““
for character in string{
  if character == “.” {
     if isbehindDecimal { continue } // Skipt extra decimals
     isbehindDecimal = true
     tokens.append(character)
     tokens.append(digits) // Add digits before the decimal
     digits = ““
  } else if (character is an operator) {
     isbehinddecimal = false
     if (tokens.last() is an operator) {
         replace last element of tokens with operator
     } else {
         tokens.append(character)
         tokens.append(digits) // Add digits before the operator
         digits = ““
     }
  } else if (character is a digit) {
     digits.append(character)
  }

}

tokens.append(digits) // Number that ends the string

最后,令牌数组将包含您感兴趣的所有内容。但是您仍然需要清理/解析输入。如果您的输入规则变得越来越复杂,这很快就会变得混乱且难以处理。然后是时候定义自己的语法了。


推荐阅读