2019年7月21日日曜日

電卓のオーバーフロー処理

電卓の小数点以下処理が実装できたので、これに従ったオーバーフロー処理を実装してみました。

class Flow{
    var queueDigit: Int
    var overFlow: Bool
    private let cut54up = CUT54UP.sharedCUT54UP
    
    init(){
        queueDigit = 12
        overFlow = false
    }
    
    func checkOverFlow(_ input: String) -> (overFlow: Bool, retValString: String) {
        var retnum = input
        let dotRemoved = input.removeCharacters(from:".")

        overFlow = dotRemoved.count > queueDigit
        if overFlow {
            if !(retnum.contains(".")) {
                var startVal: Decimal
                startVal = 1.0
                
                for _ in 1 ... (dotRemoved.count - queueDigit)  {
                    startVal = startVal * 0.1
                }
                
                var decimalNo = Decimal(string: retnum)! * startVal
                retnum = NSDecimalNumber(decimal: decimalNo).stringValue
                retnum = cut54up.change(retnum)
                
                startVal = 1.0
                for _ in 1 ... (retnum.count + queueDigit - dotRemoved.count)  {
                    startVal = startVal * 0.1
                }
                
                decimalNo = Decimal(string: retnum)! * startVal
                retnum = NSDecimalNumber(decimal: decimalNo).stringValue
                print ("E")
            }
        }
        else{
            var startVal: Decimal
            startVal = 1.0
            
            for _ in 1 ... (queueDigit)  {
                startVal = startVal * 10
            }
            
            var decimalNo = Decimal(string: retnum)! * startVal
            retnum = NSDecimalNumber(decimal: decimalNo).stringValue
            retnum = cut54up.change(retnum)
            decimalNo = Decimal(string: retnum)! / startVal
            retnum = NSDecimalNumber(decimal: decimalNo).stringValue
        }
        return (overFlow, retnum)
    }

}

ここでは、数値を文字列として入れて、これが指定桁(初期値12桁)を超えているかどうかを判定し、0以上であれば小数点以下を処理した上で、オーバーフロー桁でピリオドを打ちます。0未満であれば小数点12桁未満の処理をして値を返します。

オーバーフロ・アンダーフローが起きたかどうかは、返り値のoverFlowフラグで返します。

まだ動かしていないのでこれでいいかどうかわかりませんが、とりあえずこのように設計してみました。さて、どうなることやら。

0 件のコメント: