/// <summary> /// 計算する /// </summary> /// <param name="first">左側の値</param> /// <param name="second">右側の値</param> /// <param name="ope">操作(演算子)</param> /// <returns></returns> private string Calclate(long first, long second, EnumOperate ope) { long result = 0; switch (ope) { case EnumOperate.Addition: result = first + second; break; case EnumOperate.Subtraction: result = first - second; break; case EnumOperate.Multiplication: result = first * second; break; case EnumOperate.Division: if (second == 0) { DisplayFontSize = ERROR_DISP_FONT_SIZE; mode = EnumInputMode.Error; ButtonEnabled = false; return("0では割り算できません"); } result = first / second; break; } return(result.ToString()); }
private void Clear() { leftString = string.Empty; rightString = string.Empty; Display = "0"; operate = EnumOperate.None; DisplayFontSize = NORMAL_DISP_FONT_SIZE; prevMode = EnumInputMode.None; mode = EnumInputMode.First; ButtonEnabled = true; }
public void ButtonClick(string param) { // Enable になっているボタンを押されたときは他ボタンも Enable にする。 ButtonEnabled = true; // 負荷アップ if (bugMan.conf.InvalidCPUUse) { Burden(); } // 押されたボタンの種類を調べる var kind = JudgeButtonKind(param); if (kind == EnumButtonKind.None) { return; } if (prevMode == EnumInputMode.Result) { if (kind == EnumButtonKind.Number) { Display = string.Empty; } } // クリア処理 if (operate == EnumOperate.Clear) { Clear(); return; } // モードを判断 if (kind == EnumButtonKind.Number) { if (prevMode == EnumInputMode.Symbol || prevMode == EnumInputMode.Second) { mode = EnumInputMode.Second; } else { mode = EnumInputMode.First; } if (Display.Equals("0")) { // 「01」のような表示になることを防ぐ。 Display = string.Empty; } } else if (kind == EnumButtonKind.Mark) { if (prevMode == EnumInputMode.Second) { mode = EnumInputMode.SymbolCalc; } else { mode = EnumInputMode.Symbol; } } else if (kind == EnumButtonKind.Func) { if (operate == EnumOperate.Calclation) { if (prevMode == EnumInputMode.First) { return; } mode = EnumInputMode.Calc; } else if (operate == EnumOperate.Clear) { mode = EnumInputMode.First; } } // 2回続けて計算記号を押したとき if (prevMode == EnumInputMode.Symbol) { if (mode == EnumInputMode.Symbol) { // 演算子のマークを変更して終了(計算はしない) Display = Display.Remove(Display.Length - 1); Display += param; operationSymbol = operate; return; } } if (mode == EnumInputMode.Symbol) { leftString = Display; operationSymbol = operate; } // 実行するタイプでなければ表示文字の右側に追加 if (mode != EnumInputMode.Calc && mode != EnumInputMode.SymbolCalc) { Display += param; } // 計算処理 if (mode == EnumInputMode.Calc || mode == EnumInputMode.SymbolCalc) { if (prevMode != EnumInputMode.Result) { // 結果表示時の場合、以前の値を使うので、このチェックは行なわない if (leftString.Length == 0 || Display.Equals(leftString)) { return; } } if (prevMode == EnumInputMode.Symbol) { // 1+=のパターン rightString = leftString; } else if (prevMode == EnumInputMode.Result) { // rightString は前回のままの値を使う } else { rightString = Display.Remove(0, leftString.Length + 1); } if (rightString.Length == 0) { return; } Display = Calclate(long.Parse(leftString), long.Parse(rightString), operationSymbol); if (mode == EnumInputMode.Error) { return; } leftString = Display; //rightString = string.Empty; if (mode == EnumInputMode.SymbolCalc) { Display += GetSymbolStringFromOperationSymbol(operate); mode = EnumInputMode.Symbol; operationSymbol = operate; } else { mode = EnumInputMode.Result; operate = EnumOperate.None; } // TODO:エラー表示の Enable/Disable 切り替えは Converter を利用する方がスマート } prevMode = mode; // 桁オーバーエラー if (CheckDigitError() == false) { DigitError(); } }