Вы должны войти, чтобы создавать сообщения и темы.

Преобразование строки к числу

◄Страница 2 из 3►
Цитата: Тимур от 16.11.2021, 21:03

Хотелось бы скинуть вам код, чтобы вы могли отрефакторить его возможно, а может что то подсказать. Могу ли я это сделать?

Можете конечно, правда сам довольно таки "грязно" пишу код.

Цитата: Тимур от 16.11.2021, 21:25

Как мне установить кнопку в конструкторе так, чтобы она не прикреплялась к панели

Вот так (7:30).

Код

using System;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace Калькулятор
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
button20.Location = new Point(205, 45);
label1.Location = new Point(270, 7);
foreach (Button buttones in panel2.Controls.OfType<Button>())
{
buttones.Click += (s, a) =>
{
count++;
label1.Text += $"{buttones.Text}";
label1.Location = new Point(label1.Location.X - 10, label1.Location.Y);

};
}

foreach (Button buttonnn in panel3.Controls.OfType<Button>())
{
buttonnn.Click += (s, a) =>
{

if (count >= 1)
{
label1.Text += $"{buttonnn.Text}";
label1.Location = new Point(label1.Location.X - 10, label1.Location.Y);
count2++;
}
if (count2 >= 1)
{
count = 0;
}
};
}
button18.Click += (s, e) =>
{
label1.Text += $"{button18.Text}";
label1.Location = new Point(label1.Location.X - 10, label1.Location.Y);
count++;
};
button19.Click += (s, e) =>
{
count++;
};
button17.Click += (s, a) =>
{
label1.Text = null;
label1.Location = new Point(270, 7);
};
button15.Click += (s, a) =>
{
label1.Text += button15.Text;
};

}
private void button14_Click(object sender, EventArgs e)
{
count++;
label1.Text += $"{button14.Text}";
label1.Location = new Point(label1.Location.X - 10, label1.Location.Y);

}
public int count = 0;
public int count2 = 0;
public string line = "";
public int length = 0;
private void button20_Click(object sender, EventArgs e)
{
double value = double.Parse(label1.Text);
value /= 100;
label1.Text = value.ToString();
length = label1.Text.Length;
label1.Location = new Point(270 - (length * 10), label1.Location.Y);

}
private void button2_Click(object sender, EventArgs e)
{

string str = label1.Text;
double res = Convert.ToDouble(new DataTable().Compute(str, null));
label1.Text = res.ToString();
length = res.ToString().Length;
label1.Location = new Point(270 - (length * 10), label1.Location.Y);

}


}
}


Вот код. Кстати про ctrl + alt + t  я знал. Но при переносе к форме, кнопка улетает на 0;0 и если её на то же место перетащить, то опять прикрепление к панели. Я обошел это первой строчкой кода. Конечно неприятно писать на такую фигню код, но пока что не понял как до конца пользоваться ctrl alt t.  

Можете проект архивом кинуть?

Могу через zip файл, но как мне его прикрепить?

На какой-нибудь файлообменник, типа upload.ee, залейте и киньте сюда ссылку.

Вот ссылка

Не уверен что именно то, что надо скинул. 

Кстати уже нашёл баг, в готовом exe. Если делить допустим 5/3 а потом полученное выражение / 3, то возникает ошибка. Через отладку даже не могу понять в чём дело.

Цитата: Вася от 16.11.2021, 23:10

На какой-нибудь файлообменник, типа upload.ee, залейте и киньте сюда ссылку.

Цитата: Тимур от 17.11.2021, 14:47

Вот ссылка

Не уверен что именно то, что надо скинул. 

Кстати уже нашёл баг, в готовом exe. Если делить допустим 5/3 а потом полученное выражение / 3, то возникает ошибка. Через отладку даже не могу понять в чём дело.

Не могу найти ошибку в дебаге, т.к не знаю как работает метод Compute();

Цитата: Тимур от 17.11.2021, 14:47

Если делить допустим 5/3 а потом полученное выражение / 3, то возникает ошибка. Через отладку даже не могу понять в чём дело.

Дело в региональных настройках. Для дробных чисел на русской винде используется запятая для конвертации числа в строку и наоборот. Метод Compute почему-то игнорирует эти настройки и ждёт точку. Можно заменить запятую на точку (str.Replace(",", ".")) или переопределить региональные настройки, добавив в методы конвертации дополнительный параметр (res.ToString(numberFormatInfo); double.Parse(label1.Text, numberFormatInfo);).

Я так понял, что Вы перемещаете label1 для того, чтобы текст находился справа. Это можно сделать проще, указав в конструкторе формы для label1 свойству TextAlign значение TopRight.

Немного изменил проект.

Цитата: Вася от 17.11.2021, 23:53
Цитата: Тимур от 17.11.2021, 14:47

Если делить допустим 5/3 а потом полученное выражение / 3, то возникает ошибка. Через отладку даже не могу понять в чём дело.

Дело в региональных настройках. Для дробных чисел на русской винде используется запятая для конвертации числа в строку и наоборот. Метод Compute почему-то игнорирует эти настройки и ждёт точку. Можно заменить запятую на точку (str.Replace(",", ".")) или переопределить региональные настройки, добавив в методы конвертации дополнительный параметр (res.ToString(numberFormatInfo); double.Parse(label1.Text, numberFormatInfo);).

Я так понял, что Вы перемещаете label1 для того, чтобы текст находился справа. Это можно сделать проще, указав в конструкторе формы для label1 свойству TextAlign значение TopRight.

Немного изменил проект.

 

Огромное спасибо, что помогли мне со всем)

Кстати у меня, почему - то sln файл не открывается. Один или несколько проектов были неправильно загружены. Не понимаю.

Странно, у меня открывает. Тогда просто поменяйте в конструкторе формы TextAlign для label1 и замените код в Form1.cs на

Код

using System;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using System.Globalization;

namespace Калькулятор
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button20.Location = new Point(205, 45);
            //label1.Location = new Point(270, 7);
            foreach (Button buttones in panel2.Controls.OfType<Button>())
            {
                buttones.Click += (s, a) =>
                {
                    count++;
                    label1.Text += $"{buttones.Text}";
                    //label1.Location = new Point(label1.Location.X - 10, label1.Location.Y);

                };
            }

            foreach (Button buttonnn in panel3.Controls.OfType<Button>())
            {
                buttonnn.Click += (s, a) =>
                {

                    if (count >= 1)
                    {
                        label1.Text += $"{buttonnn.Text}";
                        //label1.Location = new Point(label1.Location.X - 10, label1.Location.Y);
                        count2++;
                    }
                    if (count2 >= 1)
                    {
                        count = 0;
                    }
                };
            }
            button18.Click += (s, e) =>
            {
                label1.Text += $"{button18.Text}";
                //label1.Location = new Point(label1.Location.X - 10, label1.Location.Y);
                count++;
            };
            button19.Click += (s, e) =>
            {
                count++;
            };
            button17.Click += (s, a) =>
            {
                label1.Text = null;
                //label1.Location = new Point(270, 7);
            };
            button15.Click += (s, a) =>
            {
                label1.Text += button15.Text;
            };

        }
        private void button14_Click(object sender, EventArgs e)
        {
            count++;
            label1.Text += $"{button14.Text}";
            //label1.Location = new Point(label1.Location.X - 10, label1.Location.Y);

        }
        public int count = 0;
        public int count2 = 0;
        public string line = "";
        public int length = 0;
        DataTable dataTable = new DataTable(); //Здесь лучше один раз создать объект и его использовать

        NumberFormatInfo numberFormatInfo = new NumberFormatInfo //региональные настройки
        {
            NumberDecimalSeparator = "."
        };

        private void button20_Click(object sender, EventArgs e)
        {
            double value = double.Parse(label1.Text, numberFormatInfo);
            value /= 100;
            label1.Text = value.ToString(numberFormatInfo);
            //length = label1.Text.Length;
            //label1.Location = new Point(270 - (length * 10), label1.Location.Y);

        }
        private void button2_Click(object sender, EventArgs e)
        {
            if (label1.Text == "")
            {

            }
            else
            {
                string str = label1.Text;
                double res = Convert.ToDouble(dataTable.Compute(str, null));
                label1.Text = res.ToString(numberFormatInfo);
                //length = res.ToString().Length;
                //label1.Location = new Point(270 - (length * 10), label1.Location.Y);
            }
            

        }


    }
}

Цитата: Вася от 18.11.2021, 00:34

Странно, у меня открывает. Тогда просто поменяйте в конструкторе формы TextAlign для label1 и замените код в Form1.cs на

Код

 
 
 
 
using System;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using System.Globalization;
 
namespace Калькулятор
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
button20.Location = new Point(205, 45);
//label1.Location = new Point(270, 7);
foreach (Button buttones in panel2.Controls.OfType<Button>())
{
buttones.Click += (s, a) =>
{
count++;
label1.Text += $"{buttones.Text}";
//label1.Location = new Point(label1.Location.X - 10, label1.Location.Y);
 
};
}
 
foreach (Button buttonnn in panel3.Controls.OfType<Button>())
{
buttonnn.Click += (s, a) =>
{
 
if (count >= 1)
{
label1.Text += $"{buttonnn.Text}";
//label1.Location = new Point(label1.Location.X - 10, label1.Location.Y);
count2++;
}
if (count2 >= 1)
{
count = 0;
}
};
}
button18.Click += (s, e) =>
{
label1.Text += $"{button18.Text}";
//label1.Location = new Point(label1.Location.X - 10, label1.Location.Y);
count++;
};
button19.Click += (s, e) =>
{
count++;
};
button17.Click += (s, a) =>
{
label1.Text = null;
//label1.Location = new Point(270, 7);
};
button15.Click += (s, a) =>
{
label1.Text += button15.Text;
};
 
}
private void button14_Click(object sender, EventArgs e)
{
count++;
label1.Text += $"{button14.Text}";
//label1.Location = new Point(label1.Location.X - 10, label1.Location.Y);
 
}
public int count = 0;
public int count2 = 0;
public string line = "";
public int length = 0;
DataTable dataTable = new DataTable(); //Здесь лучше один раз создать объект и его использовать
 
NumberFormatInfo numberFormatInfo = new NumberFormatInfo //региональные настройки
{
NumberDecimalSeparator = "."
};
 
private void button20_Click(object sender, EventArgs e)
{
double value = double.Parse(label1.Text, numberFormatInfo);
value /= 100;
label1.Text = value.ToString(numberFormatInfo);
//length = label1.Text.Length;
//label1.Location = new Point(270 - (length * 10), label1.Location.Y);
 
}
private void button2_Click(object sender, EventArgs e)
{
if (label1.Text == "")
{
 
}
else
{
string str = label1.Text;
double res = Convert.ToDouble(dataTable.Compute(str, null));
label1.Text = res.ToString(numberFormatInfo);
//length = res.ToString().Length;
//label1.Location = new Point(270 - (length * 10), label1.Location.Y);
}
 
 
}
 
 
}
}
using System; using System.Data; using System.Drawing; using System.Linq; using System.Windows.Forms; using System.Globalization; namespace Калькулятор { public partial class Form1 : Form { public Form1() { InitializeComponent(); button20.Location = new Point(205, 45); //label1.Location = new Point(270, 7); foreach (Button buttones in panel2.Controls.OfType<Button>()) { buttones.Click += (s, a) => { count++; label1.Text += $"{buttones.Text}"; //label1.Location = new Point(label1.Location.X - 10, label1.Location.Y); }; } foreach (Button buttonnn in panel3.Controls.OfType<Button>()) { buttonnn.Click += (s, a) => { if (count >= 1) { label1.Text += $"{buttonnn.Text}"; //label1.Location = new Point(label1.Location.X - 10, label1.Location.Y); count2++; } if (count2 >= 1) { count = 0; } }; } button18.Click += (s, e) => { label1.Text += $"{button18.Text}"; //label1.Location = new Point(label1.Location.X - 10, label1.Location.Y); count++; }; button19.Click += (s, e) => { count++; }; button17.Click += (s, a) => { label1.Text = null; //label1.Location = new Point(270, 7); }; button15.Click += (s, a) => { label1.Text += button15.Text; }; } private void button14_Click(object sender, EventArgs e) { count++; label1.Text += $"{button14.Text}"; //label1.Location = new Point(label1.Location.X - 10, label1.Location.Y); } public int count = 0; public int count2 = 0; public string line = ""; public int length = 0; DataTable dataTable = new DataTable(); //Здесь лучше один раз создать объект и его использовать NumberFormatInfo numberFormatInfo = new NumberFormatInfo //региональные настройки { NumberDecimalSeparator = "." }; private void button20_Click(object sender, EventArgs e) { double value = double.Parse(label1.Text, numberFormatInfo); value /= 100; label1.Text = value.ToString(numberFormatInfo); //length = label1.Text.Length; //label1.Location = new Point(270 - (length * 10), label1.Location.Y); } private void button2_Click(object sender, EventArgs e) { if (label1.Text == "") { } else { string str = label1.Text; double res = Convert.ToDouble(dataTable.Compute(str, null)); label1.Text = res.ToString(numberFormatInfo); //length = res.ToString().Length; //label1.Location = new Point(270 - (length * 10), label1.Location.Y); } } } }
 
using System;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using System.Globalization;

namespace Калькулятор
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button20.Location = new Point(205, 45);
            //label1.Location = new Point(270, 7);
            foreach (Button buttones in panel2.Controls.OfType<Button>())
            {
                buttones.Click += (s, a) =>
                {
                    count++;
                    label1.Text += $"{buttones.Text}";
                    //label1.Location = new Point(label1.Location.X - 10, label1.Location.Y);

                };
            }

            foreach (Button buttonnn in panel3.Controls.OfType<Button>())
            {
                buttonnn.Click += (s, a) =>
                {

                    if (count >= 1)
                    {
                        label1.Text += $"{buttonnn.Text}";
                        //label1.Location = new Point(label1.Location.X - 10, label1.Location.Y);
                        count2++;
                    }
                    if (count2 >= 1)
                    {
                        count = 0;
                    }
                };
            }
            button18.Click += (s, e) =>
            {
                label1.Text += $"{button18.Text}";
                //label1.Location = new Point(label1.Location.X - 10, label1.Location.Y);
                count++;
            };
            button19.Click += (s, e) =>
            {
                count++;
            };
            button17.Click += (s, a) =>
            {
                label1.Text = null;
                //label1.Location = new Point(270, 7);
            };
            button15.Click += (s, a) =>
            {
                label1.Text += button15.Text;
            };

        }
        private void button14_Click(object sender, EventArgs e)
        {
            count++;
            label1.Text += $"{button14.Text}";
            //label1.Location = new Point(label1.Location.X - 10, label1.Location.Y);

        }
        public int count = 0;
        public int count2 = 0;
        public string line = "";
        public int length = 0;
        DataTable dataTable = new DataTable(); //Здесь лучше один раз создать объект и его использовать

        NumberFormatInfo numberFormatInfo = new NumberFormatInfo //региональные настройки
        {
            NumberDecimalSeparator = "."
        };

        private void button20_Click(object sender, EventArgs e)
        {
            double value = double.Parse(label1.Text, numberFormatInfo);
            value /= 100;
            label1.Text = value.ToString(numberFormatInfo);
            //length = label1.Text.Length;
            //label1.Location = new Point(270 - (length * 10), label1.Location.Y);

        }
        private void button2_Click(object sender, EventArgs e)
        {
            if (label1.Text == "")
            {

            }
            else
            {
                string str = label1.Text;
                double res = Convert.ToDouble(dataTable.Compute(str, null));
                label1.Text = res.ToString(numberFormatInfo);
                //length = res.ToString().Length;
                //label1.Location = new Point(270 - (length * 10), label1.Location.Y);
            }
            

        }


    }
}

Здравствуйте. Решил я значит усовершенствовать свой калькулятор, добавив кнопки корня и возведения в степень, но я уже 2 день не могу их толком реализовать. Хотя частично реализовал. Понятно, что просто выводить корень 9-ти очень легко. Но вот сложение корней и другие арифметические операции выдаются лишь с ошибками.  У меня есть метод Compute(), который считывает текст и производит арифметические выражения. Но, как мне реализовать считывание с label1 символа радикала и возведения в корень? Есть ли такие символы? Просто с label.Text я получаю результат выражения, но как мне их занести в этот самый label ? Могу также кинуть то, что у меня работало, но там я писал так нелепо, лишь бы заработало. И есть еще 1 над которым сейчас работаю, но в общем-то тоже пока что не выходит. Что бы вы могли мне подсказать?

Здравствуйте. Прежде чем загонять уравнение в метод Compute(), можно решить часть уравнения с возведением в степень или взятием кореня. Например есть 2 + 5^3 * 7 и из этого делаем 2 + 125 * 7 и загоняем в Compute(). Тут уже надо парсить. Квадратный корень можно заменить на x^0.5. Символы ^ и √ добавляются так же как и другие.

Здравствуйте! Я не до конца объяснил ситуацию(но уже сам реализовал корень). Во-первых я сразу понял, что мне нужно будет находить число под знаком радикала, использовать метод Math.Sqrt и дальше передавать это значение в Compute(). Проблема скорее уже немного поменялась. Реализовать то я почти смог и думаю смогу, но то ли из-за шрифта, то ли из-за непонятно чего, в результате в label1 заносится текст, который мне не соответствует. Объясню: на клавиатуре нет знака радикала, как и степени, но я нашёл их в интернете. Поменяв текст button, которые и отвечают за выполнение этих задач, при нажатии я увидел, что это √ превращается в @, а ^ становится чем то похожим на 2 палочки. Ну т.е. совсем не то, что я ожидал увидеть. Очень хочется узнать, проблема в шрифте?Если да, то какой лучше выбрать? Или в чём тогда? И как же добавить символы, как на скриншоте. Я не всё еще знаю, да вроде и не должен.

◄Страница 2 из 3►