// 1/xボタン private void xDivOneBtn_Click(object sender, EventArgs e) { // エラーメッセージが表示の判定と今の表示が0.かどうか判定 if (display != Common.CALC_FORMAT && MyDetection.IsErrorMsg(display) == false) { decimal work = decimal.Parse(display); work = 1 / work; // 小数点があるかどうか if (MyDetection.IsValueToDot(work) == true) { // あれば桁下げしておく display = CalcManager.DotAdjust(work.ToString()); } else { // なければ最下位桁に点を追加 display = work.ToString() + '.'; } // 桁区切り display = CalcManager.ThousandSeparator(isSeparat, display); resultTxt.Text = display; } }
// 演算子ボタン #region // equal Click private void equalBtn_Click(object sender, EventArgs e) { if (MyDetection.IsErrorMsg(display) == false) { // 前回の入力が=ではない if (beforInput != Common.EQUAL) { // クリア後最初は別処理 if (operatorStorage == '\0') { calcBuff = decimal.Parse(display); } // 前回の入力が演算子 else if (MyDetection.IsValue(beforInput) == false) { calcBuff = decimal.Parse(display); } // 前回の入力された演算子がイコール else if (beforOperator == Common.EQUAL) { } // それ以外は基本的に表示している文字列を計算用バッファに入れてから演算処理を行う else { calcBuff = decimal.Parse(display); } } Calculate(Common.EQUAL); // 演算処理 } }
// 貼り付け(メニュー) private void menuPaste_Click(object sender, EventArgs e) { String str = Clipboard.GetText(); // クリップボードから取得 // 文字列を一つずつ貼り付けていく for (int i = 0; i < str.Length; ++i) { // 半角数字のみかどうか調べる if (MyDetection.IsHalfWidth(str.Substring(i, 1)) == true) { // 最初のみ一度表示を消す if (i == 0) { display = Common.CALC_FORMAT; } display = CalcManager.UpDigit(display, str.Substring(i, 1), ref beforInput, isDot); display = CalcManager.ThousandSeparator(isSeparat, display); resultTxt.Text = display; this.Refresh(); } else { // 半角数字以外のものが見つかった場合は即終了 break; } } resultTxt.Text = display; this.Refresh(); // 表示を更新 }
/// <summary> /// 桁区切り /// </summary> /// <param name="isSep">桁区切りのフラグ</param> /// <param name="str">桁区切りしたい文字列</param> /// <returns>桁区切りされた文字列</returns> public static String ThousandSeparator(Boolean isSep, String str) { String work = str; work = work.Replace(",", ""); // 桁区切りのフラグがONかどうか if (isSep) { // 右端が点(.)かどうか if (MyDetection.IsEndToDot(work)) { for (int i = work.Length - 4; i > 0; i -= 3) { work = work.Insert(i, ","); } } // 右端に点がない(値が少数である) else { for (int i = work.LastIndexOf('.') - 3; i > 0; i -= 3) { work = work.Insert(i, ","); } } } return(work); }
// +/-ボタン private void addToSubBtn_Click(object sender, EventArgs e) { // エラーメッセージが表示されているかどうか if (MyDetection.IsErrorMsg(display) == false) { // 前回の入力が演算子かどうか if (MyDetection.IsOperator(beforInput) == false) { decimal work = decimal.Parse(display); // 表示文字列をワークに代入 work *= -1; // 符号を逆にする display = work.ToString(); // 文字列化して保存 // 値が小数かどうか if (MyDetection.IsValueToDot(work) == false) { display += '.'; // 値が少数ではないなら一番右端に 点(.)を追加 } } else { // もし演算子なら表示を0.に戻す display = Common.CALC_FORMAT; isDot = false; } // 桁区切り display = CalcManager.ThousandSeparator(isSeparat, display); resultTxt.Text = display; } }
/// <summary> /// 桁下げ処理 /// </summary> /// <param name="str">桁下げしたい文字列</param> /// <param name="isDot">小数点フラグ</param> /// <returns>桁下げした文字列</returns> public static String DownDigit(String str, ref Boolean isDot) { // 小数点があるかどうかを調べる if (isDot == true) { // 小数点が一番右端にあるかどうかを判定 if (MyDetection.IsEndToDot(str) == true) { // 一番右端の場合は小数点フラグOFF // (小数点フラグだけが消える 表示は変わらない) isDot = false; } else { // 一番右端ではない場合は桁下げ str = str.Remove(str.Length - 1); } } else { // 表示用文字列が 0.ではないかどうか(0.の場合は何もしない) if (MyDetection.IsCalcFormat(str) == false) { // 一桁かどうか if (str.Length - 1 == 1) { str = Common.CALC_FORMAT; // 一桁の場合は 0.に表示を変える } else { str = str.Remove(str.Length - 2, 1); // それ以外は桁下げ } } } return(str); }
// メモリー系ボタン #region // MemoryClearボタン private void memoryClearBtn_Click(object sender, EventArgs e) { // エラーメッセージが表示されているかどうか if (MyDetection.IsErrorMsg(display) == false) { ClearApply(CLEAR_STATUS.CLEAR_MEMORY); } }
// ツールバーにあるメニューのイベント #region // コピー(メニュー) private void menuCopy_Click(object sender, EventArgs e) { Clipboard.Clear(); // クリップボードの初期化 // エラーメッセージが表示されていないか確認 if (MyDetection.IsErrorMsg(display) == false) { decimal work2 = decimal.Parse(display); Clipboard.SetText(work2.ToString()); } }
/// <summary> /// 数字ボタンのメイン処理 /// </summary> /// <param name="btnTxt">数字</param> /// <returns>成功か失敗</returns> private Boolean ClickMainValue(String valueTxt) { if (MyDetection.IsErrorMsg(display) == false) { display = CalcManager.UpDigit(display, valueTxt, ref beforInput, isDot); // 桁上げ処理 display = CalcManager.ThousandSeparator(isSeparat, display); // 桁数処理 resultTxt.Text = display; // 表示を更新 return(true); } return(false); }
// Back Click private void backBtn_Click(object sender, EventArgs e) { // エラーメッセージが表示されていない場合 if (MyDetection.IsErrorMsg(display) == false) { // 前回の入力が数字のときのみ消す if (MyDetection.IsValue(beforInput) == true) { display = display.Replace(",", ""); // 桁区切り用 display = CalcManager.DownDigit(display, ref isDot); // 桁下げ display = CalcManager.ThousandSeparator(isSeparat, display); resultTxt.Text = display; } } }
/// <summary> /// 桁上げ /// </summary> /// <param name="str">桁上げしたい文字列</param> /// <param name="upVal">桁上げする数字</param> /// <param name="beforInput">前回入力された内容</param> /// <param name="isDot">小数点フラグ</param> /// <returns>桁上げした文字列</returns> public static String UpDigit(String str, String upVal, ref char beforInput, Boolean isDot) { String work = str; // 今表示されている文字列をワークに格納 // 前回の入力が演算子かどうか if (MyDetection.IsValue(beforInput) == false && beforInput != '\0') { // 小数点フラグがONか if (isDot == true) { work += upVal; // ワークに追加したい数字を追加 } else { work = String.Empty; // ワークを初期化 work += upVal + '.'; // 今回の内容を保存 } } else { // 桁数チェック(桁数を超えていたら何もしない) if (work.Length != Common.DIGIT_MAX) { // 小数点フラグのチェック if (isDot == true) { // 小数点がついている場合はそのまま追加 work += upVal; } else { // 表示している文字列が 0. の場合は押された数字.を表示 if (MyDetection.IsCalcFormat(work) == true) { work = upVal + '.'; } else { // 小数点もついておらず表示している文字列も 0. じゃない場合は桁上げ処理を行う work = work.Insert(work.Length - 1, upVal); // .を考慮している } } } } beforInput = Char.Parse(upVal); return(work); }
// MemoryRecollボタン private void memoryRecallBtn_Click(object sender, EventArgs e) { // エラーメッセージが表示されているかどうか if (MyDetection.IsErrorMsg(display) == false) { display = memory.ToString(); // 今のメモリに表示されている数字を表示用文字列に保存 // 少数かどうか if (MyDetection.IsValueToDot(memory) == false) { display += '.'; } resultTxt.Text = display; // 表示 beforInput = Common.M; } }
// Memory+ボタン private void memoryAddBtn_Click(object sender, EventArgs e) { // エラーメッセージが表示されているかどうか if (MyDetection.IsErrorMsg(display) == false) { // Mの表示がまだない場合 if (memoryLabel.Text != "M") { this.memoryStoreBtn_Click(sender, e); // メモリーストアと同じ処理 } else { // ある場合は今のメモリに保存されている内容と今表示されている内容を加算してメモリに保存 memory = memory + decimal.Parse(display); } } beforInput = Common.M; }
// その他のボタン #region // dot Click private void dotBtn_Click(object sender, EventArgs e) { // エラーメッセージが表示されているかどうか if (MyDetection.IsErrorMsg(display) == false) { // 前回の入力が数字かどうか判定 if (MyDetection.IsValue(beforInput) == false) { // 前回の入力は演算子 display = Common.CALC_FORMAT; isDot = true; } else { // 小数点フラグがOFFならONにする if (isDot == false) { isDot = true; } } resultTxt.Text = display; } }
// MemoryStoreボタン private void memoryStoreBtn_Click(object sender, EventArgs e) { if (MyDetection.IsErrorMsg(display) == false) { // 少数桁以下の無駄な0を削除 display = CalcManager.DotAdjust(display); // 表示用文字列が0だけではなかったら if (MyDetection.IsCalcFormat(display) == false) { memory = decimal.Parse(display); // ラベルにテキスト描画 if (memoryLabel.Text == "") { memoryLabel.Text = "M"; } } resultTxt.Text = display; } }
/// <summary> /// 演算子ボタンのメイン処理(=は例外) /// </summary> /// <param name="opeTxt">演算子名</param> /// <returns>成功か失敗</returns> private Boolean ClickMainOperator(char opeTxt) { // エラーメッセージが表示されていないかどうか if (MyDetection.IsErrorMsg(display) == false) { // 前回の入力が今回と同じかどうか if (beforInput != opeTxt) { calcBuff = decimal.Parse(display); // 前の処理が=演算子もしくは演算子の場合は代入のみ if (beforInput == Common.EQUAL || MyDetection.IsValue(beforInput) == false || beforOperator == Common.EQUAL) { operatorStorage = '\0'; } Calculate(opeTxt); // 演算処理 return(true); } } return(false); }
// sqrtボタン private void sqrtBtn_Click(object sender, EventArgs e) { // エラーメッセージが表示されているか if (MyDetection.IsErrorMsg(display) == false) { // decimal型に変換 decimal work = decimal.Parse(display); // 変換した値がマイナスだった場合はエラー if (MyDetection.IsNegativeValue(work) == true) { display = Common.ERROR3; } else { work = CalcManager.DecimalSqrt(work); // 平方根に直す // 小数点があるかどうかを調べる if (MyDetection.IsValueToDot(decimal.Parse(work.ToString()))) { display = CalcManager.DotAdjust(work.ToString()); } else { // ない場合は右端に点(.)をつける display = work.ToString() + '.'; } } // 桁区切り display = CalcManager.ThousandSeparator(isSeparat, display); resultTxt.Text = display; } }
/// <summary> /// 演算処理 /// </summary> private void Calculate(Char operat) { beforInput = operat; // 前回入力された内容に演算子を入力された代入 beforOperator = operat; // 前回入力された演算子に入力された演算子代入 switch (operatorStorage) { // 加算処理 case Common.ADD: total = total + calcBuff; break; // 減産処理 case Common.SUB: total = total - calcBuff; break; // 乗算処理 case Common.MULTIPLY: total = total * calcBuff; break; // 除算処理 case Common.DIVIDE: if (calcBuff == 0) { if (total == 0) { // 0÷0の計算 display = Common.ERROR1; break; } else { // X÷0の計算 display = Common.ERROR2; break; } } total = total / calcBuff; // エラーではない場合は普通に計算 break; // 合計に代入するだけ default: total = calcBuff; break; } // エラーがdisplayに入っていないか if (MyDetection.IsErrorMsg(display) == false) { if (operat != Common.EQUAL) { // =演算子は代入しない operatorStorage = operat; } // 数値を文字列化し表示用文字列に代入 display = total.ToString(); // 少数かどうか判定し,少数ではない場合は結果に小数点を付与 if (MyDetection.IsValueToDot(total) == false) { display += '.'; } // 小数点以下無駄な0を省く display = CalcManager.DotAdjust(display); isDot = false; // 小数点フラグOFF } // 桁区切り display = CalcManager.ThousandSeparator(isSeparat, display); resultTxt.Text = display; }