首页 > 解决方案 > 在计算器中添加负数时出错

问题描述

我有这个代码:

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
    }
}

这是一个简单的计算器。我的计算有问题。

  1. 当我单击按钮时,例如:2 + 5 * - 然后应用程序因错误而关闭。当我输入这样的组合键时:2 + 5 = 这个计算将正确完成。  
  2. 如何在数字中添加逗号?

有谁知道如何解决上述问题?

标签: iosswift

解决方案


计算器是有限状态机。它可能非常复杂,但最简单的形式类似于:

计算器 FA

因此,如果我们保持简单,并将上述机器作为我们的目标,在 2 + 5 之后,我们的机器期望 equals(=) 来计算结果,或者如果添加了一个运算符(如我们的例子中的 *),它将期望下一个数字. 给一个运算符(在我们的例子中是减号)将导致错误。

复杂性仅受您的想象力限制。您可以添加对小数点、括号、幂等的支持。您想要添加的糖越多,FSM 就会变得越复杂。

我建议从最简单的开始。维护您的状态、下一个允许的转换以及错误转换时的错误处理。

快速检查 github 上的这个 repo 以获取有限状态机:https ://github.com/vishalvshekkar/SwiftFSM

以及相应的文章: https ://blog.vishalvshekkar.com/finite-state-machine-in-swift-ba0958bca34f


推荐阅读