2015-12-09 5 views
5

मैं त्रुटि "FormatException बिना क्रिया था" हो रही है - इस पर:सी # - प्रकार System.FormatException का एक बिना क्रिया का अपवाद - सूची स्ट्रिंग सूची में पूर्णांक

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

मैं इसके अलावा ऐसा करने में सक्षम होने की जरूरत है और विभाजन इसलिए मैं उन्हें एक पूर्णांक में बदलने की कोशिश कर रहा हूं। तो मुझे यकीन नहीं है कि इसे कैसे संभालना है, क्या मुझे उन्हें वापस स्ट्रिंग में बदलने की आवश्यकता होगी?

कोड:

  //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 फ़ाइल इसमें शामिल हैं:

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 

मैं सिर्फ घंटे और मिनट के अंकों को संशोधित करने की कोशिश कर रहा हूँ। समय बीतने की गणना (प्रोग्राम कितनी देर तक खोला गया है) और इसे टेक्स्ट फ़ाइल में पहले से संग्रहीत राशि में जोड़ना। फिर इसे कंसोल पर आउटपुट करने के बजाय फ़ाइल पर वापस सहेजें। (मैं फ़ाइल को पार्स और अंक हड़पने के लिए regex का उपयोग और मुझे लगता है कि मैं अगर बयान मिनट के लिए> 60 रूपांतरण इस 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

मेरा उत्तर जांचें और मुझे बताएं कि आपकी मदद करने पर मुझे बताएं। – mybirthname

उत्तर

2

यह है क्योंकि आप अगर अपने regex मैच सफल होने की जांच करना भूल गया है ।

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

असल match.Groups["hours"].Value सिर्फ एक खाली स्ट्रिंग वापस आ जाएगी जब मैच में विफल रहे। जैसा कि आप देख समस्या यह है कि आप पूर्णांक के रूप में अवैध स्ट्रिंग को पार्स कर रहे हैं

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

सही मैं यह सच है मिल गया है सच सच सच सच सच सच सच सच सच – Kai

+0

जब मैं जाँच मैं सांत्वना देने के लिए इस आउटपुट प्राप्त "{खाता =, AppId = 10, समय = सिस्टम जोड़ें। स्ट्रिंग [], the_array2 = System.String []} " – Kai

+0

Thx इसे काम कर रहा है। – Kai

1

: और बाद में Int32.Parse(String.Empty) एक FormatException

एक साधारण परीक्षण फेंक देते हैं। आपको int.TryParse विधि का उपयोग करने की आवश्यकता है।

आपको इस तरह अपना कोड लिखना होगा।

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

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

     if (!valid) 
      return -1; 

     return result; 
    } 

यहाँ आप अमान्य तार और डाल मूल्य -1 उनके लिए समाप्त करेंगे:

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

उसके बाद आप एक विधि बनाने के लिए की जरूरत है। उसके बाद यदि आप चाहते हैं कि आप इस -1 मान को हटा सकते हैं।

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

हाँ इससे मदद मिली! धन्यवाद! – Kai

+0

आपका स्वागत है – mybirthname

संबंधित मुद्दे