簡體   English   中英

修復System.FormatException

[英]Fixing a System.FormatException

我正在編寫一個代碼,該代碼將查看名為a的文本文件中的組,並且如果該代碼中的一行包含短語“ Savings Found”,它將寫出該行,如果節省30%或更多,它將放置如果前面的星號包含30%或更多並且有$ 500或更多的儲蓄,它將放置兩個星號。 下面是一個示例數據,該示例顯示了控制台的外觀,以及到目前為止的代碼:

    string find = "Savings found:";
    foreach (var line in a.Where(w => w.Contains(find)))
       {
          var subStr = line.Substring(line.IndexOf(find) + find.Length);
          var startIndex = subStr.IndexOf('(');
          var endIndex = subStr.IndexOf(')');

          var savings = double.Parse(subStr.Substring(0, startIndex - 1).Trim());
          var percent = double.Parse(subStr.Substring(startIndex + 1, endIndex - startIndex - 2).Trim());

          Console.WriteLine("{0}{1}{2}", (percent >= 30) ? "*" : string.Empty,

          (percent >= 30 && savings >= 500) ? "*" : string.Empty,
                                                        line);
         }

樣本數據/示例

* 5/21/2015 11:55:56 PM | Batch 6|386/767|50.33 %|CH2M-R|Processed NXRMN5...Checking refundable and non-refundable fares. Traditional Booking. Inside ticketing window. Minimum Savings Required: $131.00. Actual Savings: $257.18. Savings found: $257.18 (11.55 %). Savings were previously found.

我遇到的問題是我收到了FormatException錯誤,我想我知道問題出在哪里。 問題是subString的值是257.18,之后的所有值。 我不想要所有內容,我只想要數字。 我該怎么辦才能消除多余的垃圾,使其可以編譯?

這個問題類似於先前提出的問題,但是在該答案中,我得到了ArgumentIndexOutOfBounds異常,試圖解決該異常,但是在實際解決問題上並沒有走多遠,因此該問題背后的原因。

您可以為此使用正則表達式:

foreach(string line in a)
{
    Match m = Regex.Match(line, @"Savings\s+found:\s*\$(?<savings>\d+\.\d+)\s*\(\s*(?<percent>\d+\.\d+)\s*%");
    if (m.Success)
    {
        decimal savings = decimal.Parse(m.Groups["savings"].Value, CultureInfo.InvariantCulture);
        decimal percent = decimal.Parse(m.Groups["percent"].Value, CultureInfo.InvariantCulture);
        string prefix = string.Empty;
        if (percent >= 30)
        {
            if (savings >= 500)
                prefix = "**";
            else
                prefix = "*";
        }
        Console.WriteLine(prefix + line);
    }
}

看來您能夠重現該錯誤。 那很棒! 可重現的問題通常很容易解決。

假設您沒有其他工具,例如OzCode或ReSharper,這將是調試和修復它的方法:

一旦知道發生錯誤的行,就使語句更簡單。 也就是說,將其分解成較小的部分。 就你而言

var savings = double.Parse(subStr.Substring(0, startIndex - 1).Trim());

做太多事情,所以您真的不知道問題出在哪里。 將其拆分為:

var savingsString = subStr.Substring(0, startIndex - 1).Trim();
var savings = double.Parse(savingsString);

因為這樣,在調試期間,您可以將手表添加到savingsString並看到它是 在VS中觀看窗口

您可以考慮以下事實:為什么無法解析“ $ 257.18”並找到對策。 使用之前的代碼,您甚至都不知道導致問題的輸入。

潛在的對策:

  • 刪除美元: .Replace("$","")
  • 稍后啟動子字符串: subStr.Substring(1, ...)
  • savingsString = savingsString.Trim('$'); 如果您不確定是開頭還是結尾

從程序代碼看來,您知道所有必需的方法,只是不知道如何調試。

繼續這種方法,您將能夠解決代碼中的所有問題,甚至將來的問題。

而且:我不推薦正則表達式。 它們是不可讀的,沒有人想要維護它們。

我假設您想在“發現節省:”正則表達式后使用數字和十進制值。 可能有比這更好的方法,但這應該可行。

 string find = "Savings found:";
    foreach (var line in a.Where(w => w.Contains(find)))
       {
          //line = 5/21/2015 11:55:56 PM | Batch 6|386/767|50.33 %|CH2M-R|Processed NXRMN5...Checking refundable and non-refundable fares. Traditional Booking. Inside ticketing window. Minimum Savings Required: $131.00. Actual Savings: $257.18. Savings found: $257.18 (11.55 %). Savings were previously found."
          Regex regex = new Regex(@"Savings found:\s\$[0-9]*.[0-9]{2}\s*\([0-9]*.[0-9]{2} %\)");
          Match match = regex.Match(line);
          var savingsFoundSection = match.Value;

          MatchCollection matches = Regex.Matches(savingsFoundSection, @"[0-9]*\.[0-9]{2}");
          String savingsString = matches[0].Value;
          String percentString = matches[1].Value;
          //savingString = "257.18"
          //precentString = "11.55"

          var savings = double.Parse(savingsString);
          var percent = double.Parse(percentString);

          Console.WriteLine("{0}{1}{2}", (percent >= 30) ? "*" : string.Empty,

          (percent >= 30 && savings >= 500) ? "*" : string.Empty,
                                                        line);
         }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM