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 に設定
        }
    }
}

この記事が気に入ったらサポートをしてみませんか?