2014-05-09 71 views
2

在我的C#應用​​程序中,我從我的MySQL表中讀取數字數據。之後,我正在尋找一個最小的歐幾里得距離(錶行和平均元組之間)。輸入字符串格式不正確,但不知道爲什麼

我正在將MySQL表中的值讀入雙變量(f1f8和一個int變量)。我在第一行上得到了這個錯誤,我將讀者的結果寫入f1。但是,當我在讀取我的值後進行隨機計算(例如,f1 + f8)時,它會返回正確的結果。那麼爲什麼C#對輸入字符串有問題?

這裏是我的代碼:

for (int k = 1; k <= pocet; k++) 
{ 
    string queryCompare = " SELECT F1 AS Fe1, F2 AS Fe2, F3 AS Fe3, F4 AS Fe4, F5 AS Fe5, F6 AS Fe6, F7 AS Fe7, F8 AS Fe8, cluster FROM features WHERE ID=" + k; 
    MySqlCommand cmdCompare = new MySqlCommand(queryCompare, conect); 
    readerCompare = cmdCompare.ExecuteReader(); 
    readerCompare.Read(); 
    // MessageBox.Show("OK"); 
    double f1 = Convert.ToDouble(readerCompare["Fe1"].ToString()); // EXCEPTION HERE 
    double f2 = Convert.ToDouble(readerCompare["Fe2"].ToString()); 
    double f3 = Convert.ToDouble(readerCompare["Fe3"].ToString()); 
    double f4 = Convert.ToDouble(readerCompare["Fe4"].ToString()); 
    double f5 = Convert.ToDouble(readerCompare["Fe5"].ToString()); 
    double f6 = Convert.ToDouble(readerCompare["Fe6"].ToString()); 
    double f7 = Convert.ToDouble(readerCompare["Fe7"].ToString()); 
    string f88 = readerCompare["Fe8"].ToString(); 
    double f8 = Convert.ToDouble(f88, CultureInfo.InvariantCulture); 
    int cluster = Convert.ToInt32(readerCompare["cluster"].ToString()); 

    readerCompare.Close(); 
    // MessageBox.Show((f1+f8).ToString()); 

    switch (cluster) 
    { 
     case 1: 
      euklDist = (double)Math.Sqrt(
             Math.Pow(touple[0, 0] - f1, 2) + 
             Math.Pow(touple[0, 1] - f2, 2) + 
             Math.Pow(touple[0, 2] - f3, 2) + 
             Math.Pow(touple[0, 3] - f4, 2) + 
             Math.Pow(touple[0, 4] - f5, 2) + 
             Math.Pow(touple[0, 5] - f6, 2) + 
             Math.Pow(touple[0, 6] - f7, 2) + 
             Math.Pow(touple[0, 7] - f8, 2)); 

      if (euklDist < minCl1) 
      { 
       minCl1 = euklDist; 
       idCl1 = k; 
      } 
      break; 

     case 2: 
      euklDist = (double)Math.Sqrt(
             Math.Pow(touple[1, 0] - f1, 2) + 
             Math.Pow(touple[1, 1] - f2, 2) + 
             Math.Pow(touple[1, 2] - f3, 2) + 
             Math.Pow(touple[1, 3] - f4, 2) + 
             Math.Pow(touple[1, 4] - f5, 2) + 
             Math.Pow(touple[1, 5] - f6, 2) + 
             Math.Pow(touple[1, 6] - f7, 2) + 
             Math.Pow(touple[1, 7] - f8, 2)); 

      if (euklDist < minCl2) 
      { 
       minCl2 = euklDist; 
       idCl2 = k; 
      } 
      break; 

     case 3: 
      euklDist = (double)Math.Sqrt(
             Math.Pow(touple[2, 0] - f1, 2) + 
             Math.Pow(touple[2, 1] - f2, 2) + 
             Math.Pow(touple[2, 2] - f3, 2) + 
             Math.Pow(touple[2, 3] - f4, 2) + 
             Math.Pow(touple[2, 4] - f5, 2) + 
             Math.Pow(touple[2, 5] - f6, 2) + 
             Math.Pow(touple[2, 6] - f7, 2) + 
             Math.Pow(touple[2, 7] - f8, 2)); 

      if (euklDist < minCl3) 
      { 
       minCl3 = euklDist; 
       idCl3 = k; 
      } 
      break; 
    } 
} 

記錄在我的數據庫都是這種格式:

  • 從F1到F7:xx,xxx
  • F8:xx.xxx

我知道f8有小數點而不是逗號,這就是爲什麼我是你唱歌CultureInfo.InvariantCulturef8

+1

什麼是'readerCompare [「FE1」]的價值。 ToString()'完全?你的「CurrentCulture」是什麼? –

+0

@SonerGönül在f1欄中,我有大約400個值。以下是前四項:91,08; 399,02; 445,76; 60,57。在列f2,f3,f4,f5,f6,f7中使用相同的格式。我真的不知道爲什麼,但對於F8是這樣的:457.935; 452.72;等等。我目前的文化是sk-SK – user2179427

+0

@ user2179427,它在第一張唱片上失敗了嗎? –

回答

3

你不需要更新null值,只是這樣做:

Convert.ToDouble(readerCompare["Fe1"]); 

nullToDouble進行處理並將其轉換爲它的默認值; 0

看,這裏是你與上面的代碼可以使用ToDouble實現:

public static double ToDouble(object value) 
{ 
    if (value != null) 
    return ((IConvertible) value).ToDouble((IFormatProvider) null); 
    else 
    return 0.0; 
} 

UPDATE:正常的,如果你還需要支持空字符串,那麼你就必須改變這種代碼一點。首先讓我們構建一個擴展方法。創建您的解決方案新class並將其命名爲SystemExtensions,然後粘貼在此代碼:

namespace System 
{ 
    public static class SystemExtensions 
    { 
     public static string ToConvertibleDouble(this object input) 
     { 
      var s = input as string; 
      if (string.IsNullOrEmpty(s.Trim())) { return null; } 

      // this will also take care of the separator 
      return s.Replace(".", ","); 
     } 
    } 
} 

,現在讓我們使用它:

Convert.ToDouble(readerCompare["Fe1"].ToConvertibleDouble()); 
Convert.ToDouble(readerCompare["Fe2"].ToConvertibleDouble()); 
... 
Convert.ToDouble(readerCompare["Fe8"].ToConvertibleDouble()); 
+0

同樣的例外,但現在觀察窗口這樣說:\t \t + \t \t Convert.ToDouble(readerCompare [「Fe1」]); \t'Convert.ToDouble(readerCompare [「Fe1」])'拋出了一個'System.FormatException'類型的異常\t double {System.FormatException} – user2179427

+0

@ user2179427,你會在**移除ToString( )在代碼中調用? –

+0

我現在編輯了我的評論 – user2179427