0

Всем привет.

Написал программу погоды, которая считывает данные по API с сайта https://api.openweathermap.

Данные, отображаются в моей программе c точкой (с дробной частью):

скриншот программы

Я хочу, чтоб данные округлялись и выводились целым числом (как, например, byte или int).

Я понимаю, что нужно писать примерно так:

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");
   Match match = Regex.Match(line, "\"temp\":(.*?),(.*?)\"name\":\"(.*?)\",");
   label1.Text = match.Groups[3].Value + " " + `match.Groups[1].Value` + " °C";                    
}
aepot
  • 49,560
  • 3
    1. WebClient устарел, это можно понять, зайдя на офф сайт и прочитав, что его заменой теперь является HttpClient. 2. Вы получаете JSON, который бредово парсить регулярками, ибо для этого есть специальные механизмы, называющиеся "десериализацией", в современном C# есть для этого System.Text.Json. Делайте класс, в нем описывайте всю структуру JSON и десериализуйте в этот класс. 3. Зачем вам тут матиматика, конвертация, и прочее, если вы выводите это все в string? Пишите значит формат, C# сам вам все округлит, например label1.Text = $"{4.84:F0}";. – EvgeniyZ Feb 19 '23 at 15:16
  • Спасибо, буду пробовать делать так: $"{4.84:F0}" Подскажите пожалуйста, а что это такое? (F0) Я, видь новичок и только учусь – Aleksey Feb 19 '23 at 17:28
  • Если я правильно все понимаю, то мне нужно сделать так: label1.Text = match.Groups[3].Value + " " + {match.Groups[1].Value: F0} + " °C"; в моём коде – Aleksey Feb 19 '23 at 17:35
  • https://ru.stackoverflow.com/a/1407823/373567 вот ещё что есть, пригодится – aepot Feb 19 '23 at 18:53
  • Спасибо, буду изучать. – Aleksey Feb 19 '23 at 19:05

1 Answers1

1

Как округлить дробное число?

Вариант №1 - округление на уровне данных:
double x = 0.5d;
int result = (int)Math.Round(x);

Этот вариант стоит использовать в том случае, если вам необходимо проводить какие-то дальнейшие действия в коде над округлённым числом.

Вариант №2 - округление на уровне форматирования:
double x = 0.5d;
string result = $"{x:F0}";

Этот вариант стоит использовать в том случае, если вам необходимо сделать красивое представление числа для вывода.

P.S.

Также крайне советую прислушайтесь к советам из комментария @EvgeniyZ.

iikuzmychov
  • 3,092
  • вероятно стоит вспомнить что есть несколько вариантов округления - всегда в большую сторону, всегда в меньшую и математически коректное округление – Andrew Stop_RU_war_in_UA Feb 19 '23 at 17:24
  • Спасибо, я видь новичок и только учусь, вообще-то хочу в своём коде поменять, не переписывая код. буду пробовать так: $"{x:F0}" – Aleksey Feb 19 '23 at 17:30
  • Если я правильно все понимаю, то мне нужно сделать так: label1.Text = match.Groups[3].Value + " " + {match.Groups[1].Value: F0} + " °C"; в моём коде? правильно или нет? – Aleksey Feb 19 '23 at 18:03
  • @Aleksey сначала пробуйте, потом спрашивайте. Но нет, это неправильно, читайте про интерполяцию строк, а то у вас каша получилась label1.Text = $"{match.Groups[3].Value} {double.Parse(match.Groups[1].Value):F0} °C";. Ну и верно говорят, парсить JSON регулярками - зло. – aepot Feb 19 '23 at 18:57
  • спасибо, буду изучать дальше – Aleksey Feb 19 '23 at 19:00
  • @Aleksey если ответ был полезен, вы можете его принять, для этого нужно поставить зелёную галочку слева от ответа. – aepot Feb 19 '23 at 19:01
  • Это моя одна из первых программ, по этому учусь, и задаю может быть "глупые вопросы". label1.Text = $"{match.Groups[3].Value} {double.Parse(match.Groups[1].Value):F0} °C"; написал так, но у меня в программе результат тот же. Не получилось целое число. https://i.imgur.com/cjXI6yN.png https://i.imgur.com/IwPBVUe.png – Aleksey Feb 19 '23 at 19:11
  • 1
    @Aleksey у вас на фото отсутствует "...double.Parse(...)..." – iikuzmychov Feb 19 '23 at 19:55
  • @Andrew_STOP_RU_AGRESSION_IN_UA я думал об этом, но тут вопрос про обычное математическое округление, по-этому не стал дополнять ответ "полом" и "потолком" – iikuzmychov Feb 19 '23 at 19:56
  • @iiKuzmychov
    ваш пример double x = 0.5d; string result = $"{x:F0}"; в примере понятно. Мне не понятно что делать в моём примере? т.е. я понимаю что мне надо конвертировать вот это (match.Groups[1].Value) , но конкретно значение (Value) из этой группы (1). Я написал уже код по подсказкам (все кто подсказывал тут) label1.Text = $"{match.Groups[3].Value} {double.Parse(match.Groups[1].Value):F0} °C"; и всё равно не работает с таким кодом, программа. Вопрос, где моя ошибка в этом коде? Понимаю, что топчусь на одном месте, но никто пока не подсказал, чтоб заработала программа.
    – Aleksey Feb 19 '23 at 21:20
  • Еще дополню: единственное в вашем примере double x = 0.5d; string result = $"{x:F0}"; мне не понятно, так это F0 - что это означает? Нужно ли применять $"{x:F0}"; в моём примере? Я стараюсь писать мой вопрос, так чтоб было понятно, всем, что мне надо сделать в программе, чтоб она работала правильно. Но так, чтоб не переписывать ничего, а только менять в этой строке label1.Text = $"{match.Groups[3].Value} {double.Parse(match.Groups[1].Value):F0} °C"; и чтоб программа заработала, если так нельзя решить, то просто скажите, что бы не меняй тут, не заработает, потому что ....... – Aleksey Feb 19 '23 at 21:26
  • F0 это форматирование числа, которое позволяет округлить число до 0 знаков после запятой, то есть до целого числа. Я вам не просто так добавил ссылку на слово форматирования в тексте ответа, перейдите по ней – iikuzmychov Feb 19 '23 at 22:31
  • если ваша строка кода теперь выглядит так: label1.Text = $"{match.Groups[3].Value} {double.Parse(match.Groups[1].Value):F0} °C" и у вас всё равно что то не работает - обновите вопрос, добавив в него описание новой проблемы и ошибки – iikuzmychov Feb 19 '23 at 22:32
  • Извините, сразу не увидел что это ссылка, сейчас с F0 - стало понятно. Вот пожалуйста, снял видео ошибки https://www.upload.ee/download/14952868/ebc1f677136b1c7952ec/Video_2023-02-20_020320.mp4 Спасибо вам, что подсказываете и помогаете. – Aleksey Feb 20 '23 at 00:06
  • помогли на другом ресурсе, как написать код, что бы он работал: label1.Text = $"{match.Groups[3].Value} {(int)Math.Round(double.Parse(match.Groups[1].Value, CultureInfo.InvariantCulture))} °C"; задача по моему вопросу закрыта, этот код работает и это, то что надо – Aleksey Feb 25 '23 at 16:24