2014-02-09 4 views
-1

Я, наконец, взял прыжок с VB.net на C#, поэтому у меня все еще есть некоторые проблемы. Я делаю приложение для простой погоды, которое подключается через RSS-канал. Я хочу, чтобы он возвращал метку, которая определяет, если она замерзает снаружи; У меня проблемы с преобразованием строки температуры в целое число, поэтому я могу определить, меньше или равно 32 градуса. Есть идеи?C# Преобразование строки в целое число

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Xml; 

namespace WeatherApp 
{ 
    public partial class frmWeather : Form 
    { 
     string Temperature; 
     public frmWeather() 
     { 
      InitializeComponent(); 
     } 
     private void getWeather() 
     { 
      string query = string.Format("http://weather.yahooapis.com/forecastrss?w=" + txtZip.Text); 
      XmlDocument wData = new XmlDocument(); 
      wData.Load(query); 
      XmlNamespaceManager manager = new XmlNamespaceManager(wData.NameTable); 
      manager.AddNamespace("yweather", "http://xml.weather.yahoo.com/ns/rss/1.0"); 
      XmlNode channel = wData.SelectSingleNode("rss").SelectSingleNode("channel"); 
      XmlNodeList nodes = wData.SelectNodes("/rss/channel/item/yweather:forecast", manager); 
      Temperature = channel.SelectSingleNode("item").SelectSingleNode("yweather:condition", manager).Attributes["temp"].Value; 
     } 
     private void tmrWeather_Tick(object sender, EventArgs e) 
     { 
      getWeather(); 
      DateTime now = DateTime.Now; 
      lblTemp.Text = "" + Temperature; 
      if (lblTemp.Text <= "32") 
      { 
       lblResult.Text = "It is freezing outside!"; 
      } 
     } 
    } 
} 
+0

Что такое «проблема»? –

+0

К сожалению, у меня была опечатка в названии. Значение в настоящее время не является целым числом, это строка. Поэтому я не могу использовать объекты сравнения, такие как <= – Joshua

+0

Решенный. Спасибо всем! – Joshua

ответ

3

Вы можете использовать Convert.ToInt32() метод для преобразования вашего String в integer

Попробуйте:

 //lblTemp.Text = "" + Temperature; this statement is not required. 
     if (Convert.ToInt32(Temperature) <= 32) 
     { 
      lblResult.Text = "It is freezing outside!"; 
     } 

ИЛИ

вы можете использовать int.TryParse() метод для выполнения правильного преобразования, даже если данные недействительны.

Попробуйте:

 int temp; 
     if (int.TryParse(Temperature,out temp)) 
     { 
      if(temp <= 32)    
      lblResult.Text = "It is freezing outside!"; 
     } 
+0

Работал. Благодаря тонну. – Joshua

+0

@ Joshua: добро пожаловать :), не забудьте принять один из ответов –

1

Преобразовать его в целое, а затем сравнить с 32?

if (Convert.ToInt32(lblTemp.Text) <= 32) 

Или просто использовать Temperature переменную, которая является целым числом

if(Convert.ToInt32(Temperature) <= 32) 

Эта линия не имеет смысла:

lblTemp.Text = "" + Temperature; 

Вы можете определить, как Temperatureinteger или double.

0

Если температура целая, то не используйте строку, чтобы сохранить ее значение. Держите температуру как целое (или двойной) тип:

int Temperature; 

и использовать его для сравнения с целочисленным значением 32:

private void tmrWeather_Tick(object sender, EventArgs e) 
{ 
    getWeather(); 
    DateTime now = DateTime.Now; 
    lblTemp.Text = Temperature.ToString(); 

    if (Temperature <= 32)   
     lblResult.Text = "It is freezing outside!";   
} 

Кроме того, я предлагаю вам использовать Linq для Xml для синтаксического анализа:

XDocument xdoc = XDocument.Load(query); 
XNamespace yweather = "http://xml.weather.yahoo.com/ns/rss/1.0"; 
Temperature = (int)xdoc.Descendants("rss") 
         .Elements("channel") 
         .Elements("item") 
         .Element(yweather + "forecast") 
         .FirstOrDefault(); 

Если вы не хотите изменять свою реализацию, то просто проанализируйте значение температуры:

string temp = channel.SelectSingleNode("item") 
        .SelectSingleNode("yweather:condition", manager) 
        .Attributes["temp"].Value; 
Temperature = Int32.Parse(temp); 

ПРИМЕЧАНИЕ: Я предлагаю вам сделать int GetTemperature() метод вместо void getWeather() метода, потому что имя методы говорит, что это метод запроса, который должен возвращать некоторое значение вместо изменения состояния класса (возможно, вам не нужно будет Temperature поля в данном случае). Также вместо жестко закодированного значения 32 создайте некоторое постоянное целочисленное значение с именем, которое описывает, что означает 32. И, наконец, используйте Capitalization Styles, предложенный Microsoft.

0

Другой достоверный метод будет

int temp = 0; 
if (int.TryParse(lblTemp.Text, out temp)) 
{ 
    lblResult.Text = temp < 32 ? "It's freezing outside" : "Not yet freezing"; 
} 
else 
{ 
    // parsing error 
} 

Convert.ToInt() и int.parse() также будет работать, но int.TryParse() также охраняет вас от исключений в случае lblTemp.Text не содержит действительное число. Однако все эти методы решают вашу первоначальную проблему, то есть как только вы проанализируете строку в число, вы можете сравнить их с фиксированным значением.

Смежные вопросы