windows電卓
using System;
using System.Windows.Forms;
namespace WindowsCalculator
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void NumberButton(object sender, EventArgs e)
{
Button numButton = (Button)sender;
Number(numButton.Text);
}
private bool changeNumber = true;
public decimal? storedNumber = 0;
public decimal? currentNumber = null;
public decimal? memoryNumber = 0;
private bool afterEquals = false;
public enum MarksType //列挙子
{
NON,
PLUS,
MINUS,
MULTIPLIED,
DEVIDED,
PERCENT,
}
private MarksType mType = MarksType.NON;
public void Number(string numberString)
{
if (changeNumber == true || display.Text == "0")
{
display.Text = numberString;
if (afterEquals == false)
{
SetData(1);
}
else
{
if (mType == MarksType.NON)
{
SetData(1);
}
else
{
log.Text = "";
currentNumber = decimal.Parse(numberString);
if (mType != MarksType.NON)
{
storedNumber = memoryNumber;
}
else
{
SetData(1);
}
}
}
changeNumber = false;
}
else
{
if (LimitTextDisplay())
{
display.Text += numberString;
CommaSeparation();
if (afterEquals == false)
{
SetData(1);
}
else
{
if (mType == MarksType.NON)
{
SetData(1);
}
else
{
log.Text = "";
currentNumber = decimal.Parse(display.Text);
if (mType != MarksType.NON)
{
storedNumber = memoryNumber;
}
else
{
SetData(1);
}
}
changeNumber = false;
}
}
}
}
public void SetData(int zero) // zeroが0の場合、初期化
{
if (zero == 0)
{
storedNumber = 0;
memoryNumber = 0;
}
else
{
storedNumber = decimal.Parse(display.Text);
memoryNumber = decimal.Parse(display.Text);
TrimZeroes();
}
}
public bool LimitTextDisplay() // 入力文字列の桁数制限
{
var check = Math.Abs(decimal.Parse(display.Text));
if (check < 1)
{
int length = check.ToString().Length;
if (check.ToString().Length == 18)
{
return false;
}
else if (check.ToString().Length == 1 && (display.Text.Replace(",", "").Length == 18 || display.Text.Length == 19))
{
return false;
}
else
{
return true;
}
}
else
{
if (display.Text.IndexOf(".") >= 0 && display.Text.IndexOf("-") >= 0)
{
if (display.Text.Replace(",", "").Length == 18)
{
return false;
}
else
{
return true;
}
}
else if (display.Text.IndexOf("-") >= 0)
{
if (display.Text.Replace(",", "").Length == 17)
{
return false;
}
else
{
return true;
}
}
else if (display.Text.IndexOf(".") >= 0)
{
if (display.Text.Replace(",", "").Length == 17)
{
return false;
}
else
{
return true;
}
}
else
{
if (display.Text.Replace(",", "").Length == 16)
{
return false;
}
else
{
return true;
}
}
}
}
private void plas_Click(object sender, EventArgs e)
{
EqualCheck();
log.Text = currentNumber.ToString() + " " + "+";
mType = MarksType.PLUS;
}
private void minus_Click(object sender, EventArgs e)
{
EqualCheck();
log.Text = currentNumber.ToString() + " " + "-";
mType = MarksType.MINUS;
}
private void multiplication_Click(object sender, EventArgs e)
{
EqualCheck();
log.Text = currentNumber.ToString() + " " + "x";
mType = MarksType.MULTIPLIED;
}
private void division_Click(object sender, EventArgs e)
{
EqualCheck();
log.Text = currentNumber.ToString() + " " + "÷";
mType = MarksType.DEVIDED;
}
public void EqualCheck()
{
changeNumber = true;
if (afterEquals)
{
if (mType != MarksType.NON)
{
memoryNumber = currentNumber;
}
}
Calculation(mType);
afterEquals = false;
}
private void equal_Click(object sender, EventArgs e)
{
changeNumber = true;
afterEquals = false;
if (storedNumber == null)
{
storedNumber = memoryNumber;
}
if (mType == MarksType.PLUS)
{
log.Text = ((double)currentNumber).ToString() + " " + "+" + " " + storedNumber.ToString() + " " + "=";
}
else if (mType == MarksType.MINUS)
{
log.Text = ((double)currentNumber).ToString() + " " + "-" + " " + storedNumber.ToString() + " " + "=";
}
else if (mType == MarksType.MULTIPLIED)
{
log.Text = ((double)currentNumber).ToString() + " " + "x" + " " + storedNumber.ToString() + " " + "=";
}
else if (mType == MarksType.DEVIDED)
{
log.Text = ((double)currentNumber).ToString() + " " + "÷" + " " + storedNumber.ToString() + " " + "=";
}
else
{
log.Text = double.Parse(display.Text) + " " + "=";
}
Calculation(mType);
afterEquals = true;
}
public void Calculation(MarksType marks)
{
bool result;
if (afterEquals == true)
{
storedNumber = memoryNumber;
currentNumber = null;
}
try
{
if (mType == MarksType.PLUS)
{
result = CheckStock();
if (result)
{
currentNumber += (decimal)storedNumber;
TrimZeroes();
}
display.Text = currentNumber.ToString();
if (((double)currentNumber).ToString().Contains("E"))
{
display.Text = ((double)currentNumber).ToString();
}
CommaSeparation();
}
else if (mType == MarksType.MINUS)
{
result = CheckStock();
if (result)
{
currentNumber -= (decimal)storedNumber;
TrimZeroes();
}
display.Text = currentNumber.ToString();
if (((double)currentNumber).ToString().Contains("E"))
{
display.Text = ((double)currentNumber).ToString();
}
CommaSeparation();
}
else if (mType == MarksType.MULTIPLIED)
{
result = CheckStock();
if (result)
{
currentNumber *= (decimal)storedNumber;
TrimZeroes();
}
if (Digits(currentNumber))
{
Round(currentNumber);
TrimZeroes();
}
display.Text = currentNumber.ToString();
if (((double)currentNumber).ToString().Contains("E"))
{
display.Text = ((double)currentNumber).ToString();
}
CommaSeparation();
}
else if (mType == MarksType.DEVIDED)
{
result = CheckStock();
if (storedNumber == 0)
{
Error();
}
else
{
if (result)
{
currentNumber /= (decimal)storedNumber;
TrimZeroes();
}
if (Digits(currentNumber))
{
Round(currentNumber);
TrimZeroes();
}
display.Text = currentNumber.ToString();
if (((double)currentNumber).ToString().Contains("E"))
{
display.Text = ((double)currentNumber).ToString();
}
CommaSeparation();
}
}
else
{
if (display.Text.Replace(",", "").Length - 1 == display.Text.IndexOf("."))
{
display.Text = display.Text.Remove(display.Text.Length - 1, 1);
}
TrimZeroes();
display.Text = storedNumber.ToString();
currentNumber = (decimal)storedNumber;
CommaSeparation();
}
}
catch
{
Overflow();
}
storedNumber = null;
}
public bool CheckStock()
{
if (storedNumber != null && currentNumber == null)
{
currentNumber = (decimal)storedNumber;
return false;
}
else if (storedNumber == null)
{
return false;
}
else
{
return true;
}
}
public bool Digits(decimal? calc) // 計算結果に.が含まれているか
{
string cal = calc < 0 ? calc.ToString().Remove(calc.ToString().IndexOf("-"), 1) : calc.ToString();
if (cal.IndexOf(".") > 0 && cal.Length >= 17)
{
return true;
}
else
{
return false;
}
}
public void Round(decimal? calc) // 四捨五入
{
string cal = calc < 0 ? calc.ToString().Remove(calc.ToString().IndexOf("-"), 1) : calc.ToString();
int decimalPoint = cal.IndexOf(".");
var check = Math.Abs((decimal)calc);
if (check < 1)
{
currentNumber = decimal.Round((decimal)calc, 17 - decimalPoint);
}
else
{
currentNumber = decimal.Round((decimal)calc, 16 - decimalPoint);
}
}
public void TrimZeroes()
{
if (currentNumber.ToString().Contains(".") && (currentNumber.ToString()).Substring((currentNumber.ToString()).Length - 1) == "0")
{
currentNumber = decimal.Parse((currentNumber.ToString()).TrimEnd('0'));
}
else if (storedNumber.ToString().Contains(".") && (storedNumber.ToString()).Substring((storedNumber.ToString()).Length - 1) == "0")
{
storedNumber = decimal.Parse((storedNumber.ToString()).TrimEnd('0'));
}
else if (memoryNumber.ToString().Contains(".") && (memoryNumber.ToString()).Substring((memoryNumber.ToString()).Length - 1) == "0")
{
memoryNumber = decimal.Parse((memoryNumber.ToString()).TrimEnd('0'));
}
}
public void CommaSeparation()
{
if (display.Text.Contains("E"))
{
display.Text = ((double)currentNumber).ToString();
}
else
{
decimal text = decimal.Parse(display.Text);
decimal integer = Math.Truncate(text);
decimal decimalPart = Math.Abs(text - integer);
string integerComma = string.Format("{0:N0}", integer);
if ((text < 0 && integer == 0) || (display.Text.Contains("-") && integer == 0))
{
integerComma = "-" + integerComma;
}
string trimDecimal = decimalPart.ToString().Remove(0, 1);
display.Text = integerComma + trimDecimal;
}
}
public void Error()
{
if (currentNumber == 0)
{
display.Text = "結果が定義されていません";
}
else
{
display.Text = "0で割ることはできません";
}
EnableButtons(false);
}
public void Overflow()
{
display.Text = "オーバーフロー";
EnableButtons(false);
}
public void EnableButtons(bool enable)
{
//plas.Enabled = enable;
//minus.Enabled = enable;
//multiplication.Enabled = enable;
//division.Enabled = enable;
//addPlasMinus.Enabled = enable;
//decimalPoint.Enabled = enable;
//clear.Enabled = enable;
//back.Enabled = enable;
//button0.Enabled = enable;
//button1.Enabled = enable;
//button2.Enabled = enable;
//button3.Enabled = enable;
//button4.Enabled = enable;
//button5.Enabled = enable;
//button6.Enabled = enable;
//button7.Enabled = enable;
//button8.Enabled = enable;
//button9.Enabled = enable;
//equal.Enabled = enable;
//if (!enable)
//{
// allClear.BackColor = Color.LightCoral;
//}
//else
//{
// allClear.BackColor = SystemColors.ButtonHighlight;
//}
}
private void allClear_Click(object sender, EventArgs e)
{
EnableButtons(true);
changeNumber = true;
afterEquals = false;
storedNumber = 0;
currentNumber = null;
memoryNumber = 0;
mType = MarksType.NON;
log.Text = "";
display.Text = "0";
}
private void clear_Click(object sender, EventArgs e)
{
display.Text = "0";
if (afterEquals == false)
{
storedNumber = 0;
}
else
{
if (mType == MarksType.NON)
{
SetData(0);
}
currentNumber = 0;
log.Text = "";
}
}
private void back_Click(object sender, EventArgs e)
{
string minus = "-";
int letters = display.Text.Replace(",", "").Length;
if (afterEquals == false && storedNumber != null)
{
if (0 <= display.Text.IndexOf(minus) && display.Text.Replace(",", "").Length == 2)
{
display.Text = "0";
SetData(0);
}
else
{
display.Text = display.Text.Replace(",", "").Remove(letters - 1, 1);
if (display.Text.Replace(",", "").Length == 0)
{
display.Text = "0";
SetData(0);
}
else if (display.Text == "-0")
{
display.Text = "0";
SetData(0);
}
else
{
SetData(1);
}
CommaSeparation();
}
}
else
{
if (storedNumber == null)
{
if (mType != MarksType.NON)
{
log.Text = "";
}
}
else
{
if (0 <= display.Text.IndexOf(minus) && display.Text.Replace(",", "").Length == 2)
{
display.Text = "0";
currentNumber = 0;
}
else
{
display.Text = display.Text.Replace(",", "").Remove(letters - 1, 1);
if (display.Text.Replace(",", "").Length == 0)
{
display.Text = "0";
currentNumber = 0;
}
else if (display.Text == "-0")
{
display.Text = "0";
currentNumber = 0;
SetData(1);
}
else if (display.Text == "0.")
{
currentNumber = 0;
SetData(1);
}
else if (display.Text == "-0.")
{
currentNumber = 0;
SetData(1);
}
else
{
currentNumber = decimal.Parse(display.Text);
}
CommaSeparation();
}
if (mType == MarksType.NON)
{
SetData(1);
}
else
{
log.Text = "";
}
}
}
}
private void addPlasMinus_Click(object sender, EventArgs e)
{
if (afterEquals == true)
{
if (display.Text != "0")
{
currentNumber *= -1;
}
}
else
{
storedNumber = -1 * decimal.Parse(display.Text);
memoryNumber = storedNumber;
}
if (0 <= display.Text.IndexOf("-"))
{
display.Text = display.Text.Remove(display.Text.IndexOf("-"), 1);
}
else
{
if (display.Text != "0")
{
display.Text = "-" + display.Text;
}
}
if (mType == MarksType.NON)
{
SetData(1);
currentNumber = decimal.Parse(display.Text);
}
}
private void decimalPoint_Click(object sender, EventArgs e)
{
string decima = ".";
if (0 > display.Text.IndexOf(decima))
{
if (afterEquals == false)
{
if (storedNumber == null)
{
display.Text = "0.";
}
else
{
display.Text += ".";
}
SetData(1);
changeNumber = false;
}
else
{
if (storedNumber == null)
{
log.Text = "";
display.Text = "0.";
currentNumber = 0;
if (mType == MarksType.NON)
{
SetData(1);
}
changeNumber = false;
}
else
{
display.Text += ".";
}
}
}
else
{
if (afterEquals == true)
{
if (storedNumber == null)
{
log.Text = "";
display.Text = "0.";
currentNumber = 0;
if (mType == MarksType.NON)
{
SetData(1);
}
changeNumber = false;
}
}
else
{
if (storedNumber == null)
{
display.Text = "0.";
SetData(1);
changeNumber = false;
}
}
}
}
private void Square_Click(object sender, EventArgs e)
{
if (storedNumber == null)
{
storedNumber = decimal.Parse(display.Text);
}
decimal currentValue = decimal.Parse(display.Text);
currentNumber = (decimal)Math.Pow((double)currentValue, 2);
display.Text = currentNumber.ToString();
SetData(1);
CommaSeparation();
afterEquals = true; // 2乗後は直接計算結果を使用するため、afterEquals を true に設定
}
}
}
この記事が気に入ったらサポートをしてみませんか?