【问题标题】:Replace invalid decimal points in string based math equation Swift替换基于字符串的数学方程Swift中的无效小数点
【发布时间】:2021-09-18 09:29:32
【问题描述】:

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

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

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

【问题讨论】:

  • 9.9.9 不是有效值。你应该抛出一个错误。另一种选择是删除在您的值中找到的第一个句点之后的所有句点

标签: arrays swift string


【解决方案1】:

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

解决此问题的一种方法是定义您自己的语法并将您的输入解析为该语法的一个单词。实现此目的的工具有 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

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

【讨论】:

    猜你喜欢
    • 2016-08-31
    • 1970-01-01
    • 2014-03-17
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多