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

Пробую изучать C# нужна подсказка или помощ

Страница 1 из 7► 7

Всем привет
Изучаю уроки от ув. Хачатура,  дошёл до (Уроки C# – Регулярные выражения, Regex, Match, MatchCollection – C#) урока, хочу в качестве домашнего задания, написать программу типа обменки.
1) с  api  ЦБ РФ никаких вопросов, все работает.
2) а вот с api ЦБУ Украины не работает.

мой код

using System;
using System.Net;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace RegexMa
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        void button1_Click(object sender, EventArgs e)
        {
            string line = "";
            string lineukr = "";
            using (WebClient wc = new WebClient())
                line = wc.DownloadString("http://www.cbr.ru/scripts/XML_daily.asp");
            // Для Украины
            using (WebClient wcukr = new WebClient())
                lineukr = wcukr.DownloadString("https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange");

            Match matchusd = Regex.Match(line, "<Name>Доллар США</Name><Value>(.*?)</Value>");
            Match matchgrn = Regex.Match(line, "<Name>Украинских гривен</Name><Value>(.*?)</Value>");
            Match matcheuro = Regex.Match(line, "<Name>Евро</Name><Value>(.*?)</Value>");
            // Для Украины
            Match matchukrusd = Regex.Match(lineukr, "<txt>Долар США</txt><rate>(.*?)</rate>");
            Match matchukrrub = Regex.Match(lineukr, "<txt>Російський рубль</txt><rate>(.*?)</rate>");
            Match matchukreuro = Regex.Match(lineukr, "<txt>Євро</txt><rate>(.*?)</rate>");

            label1.Text = matchusd.Groups[1].Value;
            label2.Text = matchgrn.Groups[1].Value;
            label3.Text = matcheuro.Groups[1].Value;

            // Для Украины
            label7.Text = matchukrusd.Groups[1].Value;
            label8.Text = matchukreuro.Groups[1].Value;
            label9.Text = matchukrrub.Groups[1].Value;
        }
    }
}

 


Скажите пожалуйста, что я делаю не так, почему для курса Украины не работает? (просто стирается лейбл и все).
Видео работы программы.

Всем привет
Ребят разобрался сам в коде, и теперь все работает как надо.
Выкладываю здесь

код

using System;
using System.Net;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace RegexMa
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        void button1_Click(object sender, EventArgs e)
        {
            string line = "";
            string lineukr = "";

            // Для РФ
            using (WebClient wc = new WebClient())
                line = wc.DownloadString("http://www.cbr.ru/scripts/XML_daily.asp");

            Match matchusd = Regex.Match(line, "<Name>Доллар США</Name><Value>(.*?)</Value>");
            Match matchgrn = Regex.Match(line, "<Name>Украинских гривен</Name><Value>(.*?)</Value>");
            Match matcheuro = Regex.Match(line, "<Name>Евро</Name><Value>(.*?)</Value>");

            label1.Text = matchusd.Groups[1].Value;
            label2.Text = matchgrn.Groups[1].Value;
            label3.Text = matcheuro.Groups[1].Value;


            // Для Украины
            using (WebClient wcukr = new WebClient())
                lineukr = wcukr.DownloadString("https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?json");

            // Для Украины
            // Match matchukrusd = Regex.Match(lineukr, "<txt>Долар США</txt><rate>(.*?)</rate>", RegexOptions.Singleline);
            Match matchukrusd = Regex.Match(lineukr, "\"rate\":(.*?),\"cc\":\"USD\",");
            Match matchukrrub = Regex.Match(lineukr, "\"rate\":(.*?),\"cc\":\"RUB\",");
            Match matchukreuro = Regex.Match(lineukr, "\"rate\":(.*?),\"cc\":\"EUR\",");

            // Для Украины
            label8.Text = matchukrusd.Groups[1].Value;
            label7.Text = matchukreuro.Groups[1].Value;
            label9.Text = matchukrrub.Groups[1].Value;
        }

        void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            // событие на нажатие кнопки на клавиатуре Enter
            if (e.KeyValue == (char)Keys.Enter)
                button1_Click(button1, null);
        }
    }
}

 

программы может кому и пригодиться))
скрин рабочей программы.

Лайкнул Pixi
Pixi

Всем привет
Подскажите пожалуйста, не получается преобразовать в целое число (byte, int), что-то я туплю)))
Пишу программу, которая показывает погоду в городе , который сам вводишь в строке (textbox1)

Спойлер

using System;
using System.Net;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace WeatherParsim
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        void button1_Click(object sender, EventArgs e)
        {
            string line = "";
            using (WebClient wc = new WebClient())
                line = wc.DownloadString($"https://api.openweathermap.org/data/2.5/weather?q={textBox1.Text}&units=metric&appid=aeb757dd8e9de26569afcb324118845d");
            Match match = Regex.Match(line, "\"temp\":(.*?),(.*?)\"name\":\"(.*?)\",");

            label1.Text = match.Groups[3].Value + " " + match.Groups[1].Value;
        }
        void textBox1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";
        }
        void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (Regex.IsMatch(textBox1.Text, "[^-A-a-Z-z]"))
            {
                MessageBox.Show("Вводите буквы, только Латиницей", Text, MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
                textBox1.SelectionStart = textBox1.SelectionLength;
            }
        }
        void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == (Char)Keys.Enter)
            {
                button1_Click(button1, null);
            }
        }
    }
}

 


если я правильно понимаю, то мне надо в строке( label1.Text = match.Groups[3].Value + " " + match.Groups[1].Value; ), значение (match.Groups[1].Value) преобразовать в (byte или  int), чтоб получилось целое число и чтоб программа округляла.
Сейчас у меня получается так.

Привет, попробуй так

Спойлер

Скопированоprivate void button1_Click(object sender, EventArgs e)
Скопировано{
Скопированоlabel1.Text = getTemp("Kyiv");
Скопировано}

Скопированоstring getTemp(string cityName)
Скопировано{
Скопированоstring line = "";
Скопированоusing (WebClient wc = new WebClient())
Скопированоline = wc.DownloadString($"https://api.openweathermap.org/data/2.5/weather?q={cityName}&units=metric&appid=aeb757dd8e9de26569afcb324118845d");
СкопированоMatch match = Regex.Match(line, "\"temp\":(.*?),(.*?)\"name\":\"(.*?)\",");

СкопированоcityName = match.Groups[3].Value;
Скопированоint cityTemp = (int)Math.Round(Convert.ToDouble(match.Groups[1].Value));

Скопированоreturn $"City: {cityName}; Temp: {cityTemp}°C";
Скопировано}

Лайкнул Aleksey
Aleksey
Цитата: Ledgard от 17.02.2023, 19:40

Привет, попробуй так

Спойлер
Скопировано
Скопированоint cityTemp = (int)Math.Round(Convert.ToDouble(match.Groups[1].Value));Скопировано}

Привет @edelgard
Я понял, что ты делаешь, через метод по своему, а как в моем коде преобразовать?
Если я правильно понимаю, то нужно конвертить в этой строчке(label1.Text = match.Groups[3].Value + " " + (int)Math.Round(Convert.ToDouble(match.Groups[1].Value)) +" °C";) , должно получиться примерно так, но то что я написал сейчас в скобках, оно не работает.
Т.е. ход мысли я понял что нужно конвертить значение match.Groups[1].Value , например в int.
Задача, как в моём коде конвертнуть, чтоб правильно показывало цифру округленную до целой? не меняя кода.

Ну сложите все в одну строку и будет как в вашем, вот так в вашем:
label1.Text = match.Groups[3].Value + " " + ((int)Math.Round(Convert.ToDouble(match.Groups[1].Value))).ToString();

 

WebClient уже устаревший класс, как дойдете до async await попробуйте  HttpClient. Там можно и хедеры настраивать  и json файлы отправлять. В Nuget пакетах найдете System.Net.Http

Лайкнул Aleksey
Aleksey
Цитата: Ledgard от 17.02.2023, 21:20

Ну сложите все в одну строку и будет как в вашем, вот так в вашем:

label1.Text = match.Groups[3].Value + " " + ((int)Math.Round(Convert.ToDouble(match.Groups[1].Value))).ToString();

label1.Text = match.Groups[3].Value + " " + ((int)Math.Round(Convert.ToDouble(match.Groups[1].Value))).ToString();

 

Писал уже так, не работает, вот и не пойму, почему?
Вроде всё правильно написано (с вашей подсказкой), но выдаёт ошибку.

void button1_Click(object sender, EventArgs e)
        {
            string line = "";
            using (WebClient wc = new WebClient())
                line = wc.DownloadString($"https://api.openweathermap.org/data/2.5/weather?q={textBox1.Text}&units=metric&appid=aeb757dd8e9de26569afcb324118845d");
            Match match = Regex.Match(line, "\"temp\":(.*?),(.*?)\"name\":\"(.*?)\",");

            label1.Text = match.Groups[3].Value + " " + ((int)Math.Round(Convert.ToDouble(match.Groups[1].Value))).ToString();
            
          //  int cityTemp = (int)Math.Round(Convert.ToDouble(match.Groups[1].Value));
          //  return $"City: {cityName}; Temp: {cityTemp}°C";
        }

Может кто-то ещё подскажет, почему не работает?

Цитата: Юрий от 17.02.2023, 21:33

 async await 

Уже прошёл это.
HttpClient - пока еще не дошёл в уроках.

Всем привет
Запилил программу погоды, прошу оценить)
Строго не ругайте, я видь только учусь, надеюсь, что буду шарить как ув. Хачатур)) по итогу курса.

код

using System;
using System.Diagnostics;
using System.Drawing;
using System.Net;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace WeatherParsim
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        void button1_Click(object sender, EventArgs e)
        {
            string line = "";
            using (WebClient wc = new WebClient())
                line = wc.DownloadString($"https://api.openweathermap.org/data/2.5/weather?q={textBox1.Text}&units=metric&appid=aeb757dd8e9de26569afcb324118845d");
            Match match = Regex.Match(line, "\"temp\":(.*?),(.*?)\"name\":\"(.*?)\",");

            label1.Text = match.Groups[3].Value + " " + match.Groups[1].Value + " °C";
                    
        }
        void textBox1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";
        }
        void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (Regex.IsMatch(textBox1.Text, "[^-A-a-Z-z- -]"))
            {
                MessageBox.Show("Введите буквы, только Латиницей", Text, MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
                textBox1.SelectionStart = textBox1.SelectionLength;
            }
        }
        void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == (Char)Keys.Enter)
            {
                button1_Click(button1, null);
            }
        }

        void Form1_Load(object sender, EventArgs e)
        {
            LinkLabel label = new LinkLabel();
            label.Text = "API по сайту";
            label.Location = new Point(120, 12);
            label.Click += (s, a) => { Process.Start(@"https://openweathermap.org"); };
            Controls.Add(label);

        }

        void timer1_Tick(object sender, EventArgs e)
        {
            string date_time = DateTime.Now.ToString();
            label2.Text = date_time;
        }
    }
}

 


Единственное, не могу конвертнуть в строке (label1.Text = match.Groups[3].Value + " " + match.Groups[1].Value + " °C";), а точнее понимание есть, что нужно делать примерно так: ((int)Math.Round(Convert.ToDouble(match.Groups[1].Value))).ToString();
но увы, не работает так, и не пойму пока почему, если кто подскажет, буду благодарен.
Программа

ув. Хачатур привет
Есть у меня такая особенность, если не получается что-то в коде программирования, то нужно разобраться, пытаюсь писать везде и гуглить тоже, пересматриваю видео еще раз, но все равно не получается, значит я, что-то не понимаю.
Пожалуйста поясни мне как, преобразовать (конвертнуть) вот такую строчку (label1.Text = $"{match.Groups[3].Value} {match.Groups[1].Value} °C";), а точнее значение ( {match.Groups[1].Value} ) в целое (без точки) ? Но что бы не переписывать этот код (конкретно в этом коде, конвертнуть), помоги разобраться.
Спасибо
пробовал уже разные версии: CompareTo , double , ConvertTo ...       но не получается, почему? Просьба пояснить, что бы я понял свою ошибку.
Всё таки мучают меня мои ошибки (хочется их исправлять), но без подсказки не могу.

Привет.
Дай исходник со всеми файлами, попробую, а то так кидать, гадать можно долго.

«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн

Привет Миша
буду очень признателен, за пояснения и помощь.
вот ссылка

Вроде получилось, тык.

double temperature = double.Parse(match.Groups[1].Value, CultureInfo.InvariantCulture);
int temperatureInt = Convert.ToInt32(temperature);
label1.Text = $"{match.Groups[3].Value} {temperatureInt} °C";

Преобразую первую группу в double.Parse() метод и сохраняю в переменную temperature, далее из переменной вытаскиваем и преобразуем в целое, сохраняем в temperatureInt, все, дальше передаем в лейбл.

Лайкнул Aleksey
Aleksey
«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн
Страница 1 из 7► 7