arrays - 替换基于字符串的数学方程Swift中的无效小数点
问题描述
我正在研究另一种方法来验证 iOS 计算器应用程序上的用户输入。我已经编写了可以转换字符串示例的代码:“9*++8”>“9+8”。该代码接受用户输入的最后一个运算符并删除其余运算符。我知道这可能不是最有效的输入验证方法,但我正在使用它并试图弄清楚。
我的问题是当用户输入“9.9.9+9.9”之类的内容时。理想情况下,我想删除第一次出现小数后出现的所有小数,然后在每次引入数学运算符(+、-、* 等)时重新启动此逻辑。
寻找可以给我“9.9.9+9.9”>“9.99+9.9”的 I/O 的东西
解决方案
有很多方法可以解决这样的问题。
解决此问题的一种方法是定义您自己的语法并将您的输入解析为该语法的一个单词。实现此目的的工具有 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
最后,令牌数组将包含您感兴趣的所有内容。但是您仍然需要清理/解析输入。如果您的输入规则变得越来越复杂,这很快就会变得混乱且难以处理。然后是时候定义自己的语法了。
推荐阅读
- java - 将模拟推送到远程 Wiremock 服务器失败并出现“JSON Parsing”错误
- javascript - 导入节点模块时出现 ImportError
- python - 如何从 arcgis 10.2 发行版在 python 2.7 解释器上安装 psycopg2
- python - 如何将新字典添加到字典python中的现有键
- parent - Cytoscape.js - 更改父节点的大小
- python - 是否有 Python 包允许针对我可以通过 conda 安装的 Newcomb-Benford 发行版执行 Kolmogorov Smirnov 测试?
- javascript - 如何使用 javascript 变量作为 html 的 div id?
- visual-studio-code - 为什么在 VS Code 中打开 Google Chrome 窗口?
- android - 如何在 Android 中为 Firebase Crashlytics 设置多个应用用户,包括 GDPR 合规性?
- mysql - 存储用户名和密码的表中的 InnoDB 与 MyISAM