2015-12-09 10 views
5
hatası "FormatException işlenmeyen oldu" alıyorum

- Bu tarih:C# - Bir işlenmeyen tipi System.FormatException ait istisna - Liste dize Listeye int

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

ben eklenmesini yapabilmek gerekiyor ve Bu yüzden bu yüzden onları bir tamsayıya dönüştürmeye çalışıyorum. Bu yüzden, bunun nasıl halledileceğinden emin değilim, onları tekrar dizeye dönüştürmem gerekecek mi?

Kodu:

  //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); 

Hours.txt dosyası bu içerir:

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 

Sadece Saat ve Dakika hanelerini değiştirmek çalışıyorum. Geçen sürenin hesaplanması (programın ne kadar süre açıldığı) ve metin dosyasında kayıtlı olan miktara eklenir. Ardından konsola göndermek yerine dosyayı tekrar kaydedin. (Ben dosyayı ayrıştırmak ve rakamları kapmak için normal ifadeler kullanabilirsiniz ve ben eğer deyim dakikaya bu afaik benzer> 60 dönüşüm yapmak gerek): Eğer regex maç başarılı olmadığını kontrol etmek unuttum çünkü

    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

Cevabımı kontrol edin ve size yardımcı olup olmadığını söyleyin. – mybirthname

cevap

2

O var . maç başarısız olunca

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

Aslında match.Groups["hours"].Value sadece boş bir dize döndürür. Eğer sorun tamsayı olarak geçersiz bir dize ayrıştırma olmasıdır bkz gibi

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

Doğru ben Gerçek var Gerçek Gerçek Gerçek Gerçek Gerçek Gerçek Gerçek Gerçek Gerçek – Kai

+0

i bu çıktı konsola olsun çeki "{Hesap =, AppId = 10, Zaman = System eklediğinizde. String [], the_array2 = System.String []} " – Kai

+0

Thx çalışıyor. – Kai

1

: Ve sonradan Int32.Parse(String.Empty) bir FormatException

Basit bir test fırlatır. Int.TryParse yöntemini kullanmanız gerekir.

Kodunuzu böyle yazmanız gerekir.

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

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

     if (!valid) 
      return -1; 

     return result; 
    } 
Burada

geçersiz dizeleri ve koyun değerini -1 onlar için ortadan kaldıracaktır:

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

Bundan sonra bir yöntem oluşturmanız gerekir. Bundan sonra isterseniz bu -1 değerini kaldırabilirsiniz.

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

Evet, yardımcı oldu! Teşekkürler! – Kai

+0

size bekliyoruz – mybirthname

İlgili konular