ios - 在计算器中添加负数时出错
问题描述
我有这个代码:
class MainViewController: UIViewController {
@IBOutlet weak var summaryLbl: UILabel!
var actualNumber: Double = 0
var previousNumber: Double = 0
var operationMath: Bool = false
var operation = 0
@IBAction func numberPressed(_ sender: UIButton) {
if operationMath == true {
summaryLbl.text = String(sender.tag)
actualNumber = Double(summaryLbl.text!)!
operationMath = false
} else {
if summaryLbl.text == "0" {
summaryLbl.text = ""
}
summaryLbl.text = summaryLbl.text! + String(sender.tag)
actualNumber = Double(summaryLbl.text!)!
}
}
@IBAction func buttons(_ sender: UIButton) {
if summaryLbl.text != "" && sender.tag != 10 && sender.tag != 17 {
previousNumber = Double(summaryLbl.text!)!
if sender.tag == 13 {
summaryLbl.text = "/"
} else if sender.tag == 14 {
summaryLbl.text = "x"
} else if sender.tag == 15 {
summaryLbl.text = "-"
} else if sender.tag == 16 {
summaryLbl.text = "+"
} else if sender.tag == 11 {
var number: Double = Double(summaryLbl.text!)!
number.negate()
let rounded = number.rounded()
summaryLbl.text = String(rounded).replacingOccurrences(of: ".0", with: "", options: .literal, range: nil)
}
operation = sender.tag
operationMath = true
} else if sender.tag == 17 {
var result: Double = 0
var rounded: Double = 0
if operation == 13 {
result = previousNumber / actualNumber
} else if operation == 14 {
result = previousNumber * actualNumber
} else if operation == 15 {
result = previousNumber - actualNumber
} else if operation == 16 {
result = previousNumber + actualNumber
} else if operation == 12 {
result = previousNumber.truncatingRemainder(dividingBy: actualNumber)
}
rounded = result.rounded()
if (result == rounded) {
summaryLbl.text = String(result).replacingOccurrences(of: ".0", with: "", options: .literal, range: nil)
} else {
summaryLbl.text = String(result)
}
} else if sender.tag == 10 {
summaryLbl.text = "0"
previousNumber = 0
actualNumber = 0
operation = 0
}
}
override func viewDidLoad() {
super.viewDidLoad()
summaryLbl.text = "0"
previousNumber = 0
actualNumber = 0
operation = 0
}
}
这是一个简单的计算器。我的计算有问题。
- 当我单击按钮时,例如:2 + 5 * - 然后应用程序因错误而关闭。当我输入这样的组合键时:2 + 5 = 这个计算将正确完成。
- 如何在数字中添加逗号?
有谁知道如何解决上述问题?
解决方案
计算器是有限状态机。它可能非常复杂,但最简单的形式类似于:
因此,如果我们保持简单,并将上述机器作为我们的目标,在 2 + 5 之后,我们的机器期望 equals(=) 来计算结果,或者如果添加了一个运算符(如我们的例子中的 *),它将期望下一个数字. 给一个运算符(在我们的例子中是减号)将导致错误。
复杂性仅受您的想象力限制。您可以添加对小数点、括号、幂等的支持。您想要添加的糖越多,FSM 就会变得越复杂。
我建议从最简单的开始。维护您的状态、下一个允许的转换以及错误转换时的错误处理。
快速检查 github 上的这个 repo 以获取有限状态机:https ://github.com/vishalvshekkar/SwiftFSM
以及相应的文章: https ://blog.vishalvshekkar.com/finite-state-machine-in-swift-ba0958bca34f
推荐阅读
- java - 解析 Json 数组 java
- python - 尽管有 GIL,python 多线程程序如何同时在不同的 CPU 内核上运行
- php - 我的设备上有 XAMPP,但现在我的项目无法在 localhost 上运行,我必须将其卸载
- spring-boot - 如何在 Spring Boot >= 2.4 中使用 kubernetes 机密设置 spring.data.source.password
- reporting-services - 参数数据类型 nvarchar 对 SSRS 中转换函数的参数 3 无效
- java - WebClient 未解析对 json 对象列表的响应
- java - 如何修复错误:java.sql.SQLException:找不到适用于 https://my_account.snowflakecomputing.com/ 的驱动程序?
- microsoft-graph-api - 如何使用 Java Microsoft Graph SDK 检索可传递的用户组
- makefile - gnu make:过滤掉转义的空格分隔的单词
- sql - 如何使用 order by 在 Oracle SQL 中选择中间 80% 行(top % 不起作用)