133 lines
3.7 KiB
Swift
133 lines
3.7 KiB
Swift
//
|
||
// Calculator.swift
|
||
// AndroidCalculator
|
||
//
|
||
// Created by Pin Lin on 2020/5/5.
|
||
// Copyright © 2020 Pin Lin. All rights reserved.
|
||
//
|
||
|
||
import Foundation
|
||
|
||
class Calculator {
|
||
var formula = ["0"]
|
||
|
||
var process: String {
|
||
get {
|
||
var result = ""
|
||
formula.forEach { (item) in
|
||
result.append(item)
|
||
}
|
||
return result
|
||
}
|
||
}
|
||
|
||
var result: String {
|
||
get {
|
||
if formula.count < 3 {
|
||
return ""
|
||
}
|
||
|
||
var calculatingFormula = formula
|
||
if ["+", "-", "×", "÷"].firstIndex(of: calculatingFormula.last!) != nil {
|
||
calculatingFormula.removeLast()
|
||
}
|
||
|
||
while true {
|
||
let indexOf乘號 = calculatingFormula.firstIndex(of: "×")
|
||
let indexOf除號 = calculatingFormula.firstIndex(of: "÷")
|
||
|
||
if indexOf乘號 == nil && indexOf除號 == nil {
|
||
break
|
||
}
|
||
if indexOf乘號 != nil && (indexOf除號 == nil || indexOf乘號! < indexOf除號!) {
|
||
let number1 = Double(calculatingFormula[indexOf乘號! - 1])!
|
||
let number2 = Double(calculatingFormula[indexOf乘號! + 1])!
|
||
calculatingFormula[indexOf乘號! - 1] = String(number1 * number2)
|
||
calculatingFormula.remove(at: indexOf乘號! + 1)
|
||
calculatingFormula.remove(at: indexOf乘號!)
|
||
}
|
||
if indexOf除號 != nil && (indexOf乘號 == nil || indexOf除號! < indexOf乘號!) {
|
||
let number1 = Double(calculatingFormula[indexOf除號! - 1])!
|
||
let number2 = Double(calculatingFormula[indexOf除號! + 1])!
|
||
calculatingFormula[indexOf除號! - 1] = String(number1 / number2)
|
||
calculatingFormula.remove(at: indexOf除號! + 1)
|
||
calculatingFormula.remove(at: indexOf除號!)
|
||
|
||
}
|
||
}
|
||
|
||
print(calculatingFormula)
|
||
return calculatingFormula[0]
|
||
}
|
||
}
|
||
|
||
func click(_ text: String) {
|
||
switch text {
|
||
case "AC":
|
||
// 清空到剩下 0
|
||
formula = ["0"]
|
||
|
||
case "0":
|
||
if formula.last == "0" {
|
||
return
|
||
} else if ["+", "-", "×", "÷"].firstIndex(of: formula.last!) != nil {
|
||
formula.append(text)
|
||
} else {
|
||
formula.append(formula.popLast()! + text)
|
||
}
|
||
|
||
case "1", "2", "3", "4", "5", "6", "7", "8", "9":
|
||
if formula.last == "0" {
|
||
formula.removeLast()
|
||
formula.append(text)
|
||
} else if ["+", "-", "×", "÷"].firstIndex(of: formula.last!) != nil {
|
||
formula.append(text)
|
||
} else {
|
||
formula.append(formula.popLast()! + text)
|
||
}
|
||
|
||
case ".":
|
||
if formula.last!.firstIndex(of: ".") != nil {
|
||
return
|
||
} else if ["+", "-", "×", "÷"].firstIndex(of: formula.last!) != nil {
|
||
return
|
||
} else {
|
||
formula.append(formula.popLast()! + text)
|
||
}
|
||
|
||
case "+", "-", "×", "÷":
|
||
if ["+", "-", "×", "÷"].firstIndex(of: formula.last!) != nil {
|
||
formula.removeLast()
|
||
}
|
||
formula.append(text)
|
||
|
||
case "+/-":
|
||
if ["+", "-", "×", "÷"].firstIndex(of: formula.last!) != nil {
|
||
formula.append("0")
|
||
}
|
||
if formula.last!.firstIndex(of: "-") != nil {
|
||
var number = formula.popLast()!
|
||
number.removeFirst()
|
||
formula.append(number)
|
||
} else {
|
||
formula.append("-" + formula.popLast()!)
|
||
}
|
||
|
||
case "%":
|
||
if ["+", "-", "×", "÷"].firstIndex(of: formula.last!) != nil {
|
||
return
|
||
}
|
||
formula.append(String(Double(formula.popLast()!)! / 100))
|
||
if Double(formula.last!)!.truncatingRemainder(dividingBy: 1) == 0 {
|
||
var number = formula.popLast()!
|
||
number.removeLast()
|
||
number.removeLast()
|
||
formula.append(number)
|
||
}
|
||
|
||
default:
|
||
print(formula)
|
||
}
|
||
}
|
||
}
|