2019年7月13日土曜日

電卓エンジンを10進数にする

これまではとりあえず、無難に演算をDoubleでやってきましたが、演算部の分離に成功したので、そのままエンジンを10進演算に切り替えたいと思います。

これまでのエンジンはこちら。

    func equalOperation() -> Double?{
        if noEqualOperaterSet.contains(operaterQueue!) {
            switch operaterQueue {
            case "+": return Double(operand1!)! + Double(operand2!)!
            case "-": return Double(operand1!)! - Double(operand2!)!
            case "/": return Double(operand1!)! / Double(operand2!)!
            case "*": return Double(operand1!)! * Double(operand2!)!
            default: return nil
            }
        }
        else{
            return nil
        }
    }

イコールキーとかを押した時の演算関数になります。

では10進演算に置き換えましょう。それがこちら。

    func equalOperation() -> String?{
        if noEqualOperaterSet.contains(operaterQueue!) {
            switch operaterQueue {
            case "+":
                let retVal = Decimal(string: operand1!)! + Decimal(string: operand2!)!
                return NSDecimalNumber(decimal: retVal).stringValue
            case "-":
                let retVal = Decimal(string: operand1!)! - Decimal(string: operand2!)!
                return NSDecimalNumber(decimal: retVal).stringValue
            case "/":
                let retVal = Decimal(string: operand1!)! / Decimal(string: operand2!)!
                return NSDecimalNumber(decimal: retVal).stringValue
            case "*":
                let retVal = Decimal(string: operand1!)! * Decimal(string: operand2!)!
                return NSDecimalNumber(decimal: retVal).stringValue
            default: return nil
            }
        }
        else{
            return nil
        }
    }

こんな感じです。この返り値をStringにする方法が結構わからなかったですね。

1
1
1.2
1.23
1.234
1.2345
Operator -
1
1
1.2
1.23
1.234
1.2340
Operator *
0.0005
1
10
100
1,000
Operator =
0.5

計算結果も1.2345 - 1.2340 *1000 = 0.5 となり、どうやら10進で計算できているようです。

0 件のコメント: