Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# - An unhandled exception of type System.FormatException - List String to List int

I'm getting the error "FormatException was unhandled" - on this:

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

I need to be able to do addition and division so that's why I'm trying to convert them into an integer. So I'm not sure how to handle this, would I need to convert them back to string?

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

The Hours.txt file includes this:

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

I'm just trying to modify the digits of Hours and Minutes. Calculating the time elapsed (the amount of how long the program has been opened) and adding it to the amount already stored in the text file. Then save it back to the file instead of outputting it to console. (I parse the file and use regex to grab the digits and I think I need to do if statement to minutes >60 conversion similar to this 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;
                    }
like image 463
Kai Avatar asked Oct 18 '22 20:10

Kai


1 Answers

It's because you forgot to check if your regex match succeed.

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

Actually match.Groups["hours"].Value will just return an empty string when the match failed. And subsequently Int32.Parse(String.Empty) will throw a FormatException

A simple 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
like image 113
Perfect28 Avatar answered Oct 21 '22 15:10

Perfect28