2015-12-09 19 views
5

Ich erhalte die Fehlermeldung „Format wurde nicht behandelt“ - auf diese:C# - Eine nicht behandelte Ausnahme des Typs System.FormatException - Liste String zur Liste int

  List<int> myStringList = LoadHours.ConvertAll(s => Int32.Parse(s)); 

Ich brauche zusätzlich tun zu können und Division, deshalb versuche ich, sie in eine ganze Zahl zu konvertieren. Ich bin mir nicht sicher, wie ich damit umgehen soll, müsste ich sie wieder in eine Zeichenfolge konvertieren?

Der Code:

  //string txt = "Account: xxx123xxx\r\nAppID 10: 55 Hours 4 Minutes\r\n\r\nAccount: xxx124xxx\r\nAppID 730: 62 Hours 46 Minutes\r\nAppID 10: 3 Hours 11 Minutes\r\n\r\nAccount: xxx125xxx\r\nAppID 10: 0 Hours 31 Minutes\r\n"; 
      string path = @"Hours.txt"; 
      string text = File.ReadAllText(@"Hours.txt"); 
      Regex pattern = new Regex(@"^((AppID (?<appid>\d+): ((?<hours>\d+) Hours)?((?<minutes>\d+) Minutes)?)|(Account: (?<account>xxx\d+xxx)))", RegexOptions.Multiline); 

      string[] lines = File.ReadAllLines(path); 

      int HrElapsed; 
      int MinElapsed; 

      Int32.TryParse(HoursElapsed(), out HrElapsed); 
      Int32.TryParse(MinutesElapsed(), out MinElapsed); 

      List <string> LoadHours = new List <string>(); 
      List <string> LoadMinutes = new List <string>(); 

      // Iterate through lines 
      foreach(string line in lines) { 
      //Check if line matches your format here 
      Match match = pattern.Match(line); 
      LoadHours.Add(match.Groups["hours"].Value); 
      LoadMinutes.Add(match.Groups["minutes"].Value); 
      //File.WriteAllText(@"Hours.txt", Regex.Replace(File.ReadAllText(@"Hours.txt"), @"AppID \d+:\s(\d+\s\w+\s\d+\s\w+)",LogTime)); 
      } 
      List <int> myStringList = LoadHours.ConvertAll(s => Int32.Parse(s)); 
      List <int> myStringList2 = LoadMinutes.ConvertAll(s => Int32.Parse(s)); 

      for (int i = 0; i < myStringList.Count; ++i) 

      { 
      myStringList[i] = myStringList[i] + HrElapsed; 
      } 

      for (int i = 0; i < myStringList2.Count; ++i) { 
      myStringList2[i] = myStringList2[i] + MinElapsed; 
      } 

      string[] the_array = myStringList.Select(i => i.ToString()).ToArray(); 
      string[] the_array2 = myStringList2.Select(i => i.ToString()).ToArray(); 

      Regex re = new Regex(@"^((AppID (?<appid>\d+): ((?<hours>\d+) Hours)?((?<minutes>\d+) Minutes)?)|(Account: (?<account>xxx\d+xxx)))", RegexOptions.Multiline); 
      string hackount = ""; 
      (from m in re.Matches(text).Cast <Match>() 

      let acc = m.Groups["account"].Value 
      let app = m.Groups["appid"].Value 
      // let hrs = m.Groups["hours"].Value 
      // let mins = m.Groups["minutes"].Value 
      let timHours = the_array 
      let timMinutes = the_array2 
      let obj = new { 
      Account = acc == "" ? hackount : (hackount = acc), AppId = app, Time = the_array, the_array2 
      } 
      where app != "" 
      select obj 

      ).ToList().ForEach(Console.WriteLine); 

Die Hours.txt-Datei enthält diese:

Account: xxx123xxx 
AppID 10: 1 Hours 5 Minutes 

Account: xxx124xxx 
AppID 10: 2 Hours 6 Minutes 
AppID 10: 3 Hours 7 Minutes 

Account: xxx125xxx 
AppID 10: 4 Hours 8 Minutes 

Ich versuche nur die Ziffern von Stunden und Minuten zu ändern. Berechnung der verstrichenen Zeit (die Dauer der Programmöffnung) und Hinzufügen zu der bereits in der Textdatei gespeicherten Menge. Dann speichern Sie es zurück in die Datei, anstatt es an die Konsole auszugeben. (I analysieren Sie die Datei und verwenden regex die Ziffern zu packen und ich denke ich, wenn Anweisung Minuten tun müssen,> 60 Umwandlung ähnlich wie diese afaik):

    int TotalHours = HrElapsed + HrStored; 
        int TotalMinutes = MinElapsed + MinStored; 

        // Just making sure the minutes don't end up as "141 minutes" so it's incrementing hours. 
        if (TotalMinutes >= 60) 
        { 
         int remainder = TotalMinutes % 60; 
         int whole = TotalMinutes/60; 
         TotalMinutes = remainder; 
         TotalHours = TotalHours + whole; 
        } 
+0

Überprüfen Sie meine Antwort und sagen Sie mir, ob Ihnen geholfen hat. – mybirthname

Antwort

2

Es ist, weil Sie zu überprüfen vergessen, wenn Ihre Regex erfolgreich .

if (match.Success) // You need this check 
{ 
    LoadHours.Add(match.Groups["hours"].Value); 
    LoadMinutes.Add(match.Groups["minutes"].Value); 
} 

Eigentlich match.Groups["hours"].Value wird nur eine leere Zeichenfolge zurück, wenn das Spiel ist fehlgeschlagen. Und anschließend wird Int32.Parse(String.Empty) werfen einen FormatException

Ein einfacher Test:

Regex pattern = new Regex(@"(?<hours>\d+)d"); 
Match match = pattern.Match("Textwithoutdigits"); 
var value = match.Groups["hours"].Value; 
Console.WriteLine(value == String.Empty); // <-- Will print true 
+0

Correct Ich habe wahre bekam Wahre Wahre Wahre Wahre Wahre Wahre Wahre Wahre Wahre – Kai

+0

Wenn ich hinzufügen das Kontroll ich diese Ausgabe erhalten zu trösten „{Account =, AppId = 10, Zeit = System. String [], the_array2 = System.String []} " – Kai

+0

Thx hat es funktioniert. – Kai

1

Wie Sie sehen das Problem ist, dass Sie ungültige Zeichenfolge als Integer parsen. Sie müssen die int.TryParse-Methode verwenden.

Sie müssen Ihren Code so schreiben.

List<int> myStringList = LoadHours.ConvertAll(s => TryParseString(s)); 

Danach müssen Sie eine Methode erstellen:

private static int TryParseString(string p) 
    { 
     int result = 0; 

     bool valid = int.TryParse(p, out result); 

     if (!valid) 
      return -1; 

     return result; 
    } 

Hier finden Sie ungültige Strings und legen Wert beseitigen -1 für sie. Wenn Sie möchten, können Sie diesen Wert -1 entfernen.

myStringList = myStringList.Where(x=>x!=-1).ToList(); 
+0

Ja, es hat geholfen! Danke! – Kai

+0

Sie sind willkommen – mybirthname

Verwandte Themen