2012-09-18 58 views
4

我有一個解析字符串到double的問題。我從文本文件中讀取一行StreamWriter。該文本文件有以下幾行:不能double.Parse字符串

17-09-2012: (100,98) 
17-09-2012: (50,57) 

現在,我想從裏面括號使用的值,它們相加,並在文本框中顯示出來。到目前爲止,我有以下幾點:

int counter = 0; 
double res = 0; 
string line; 

System.IO.StreamReader file = new System.IO.StreamReader("d:\\test.txt"); 
while ((line = file.ReadLine()) != null) 
{ 
    string par = Regex.Match(line, @"\(([^)]*)\)").Value; 
    double par2 = double.Parse(par); 
    res += par2; 

    counter++; 
} 
file.Close(); 
textBox1.Text = res.ToString(); 

然而,顯然輸入字符串是不正確的格式,我覺得相當奇怪,因爲正則表達式應該刪除一切,但括號內的數字。我甚至通過將字符串寫入文本框而沒有先將它們添加到一起來檢查了這一點,並且它顯示"100,9850,57"。所以真的,我不明白,爲什麼它不能將字符串轉換爲double。

我希望你能告訴我,我做錯了什麼。

+3

+1用於添加SSCCE並顯示您嘗試過的內容。 –

+2

我不確定您的語言是否支持您的雙倍逗號 – gtgaxiola

+0

我不認爲是這種情況,因爲我製作了一個計算器,實際上它可以處理包含逗號的數字。當時我沒有做任何特別的事情來允許這一點。 – Robin

回答

2

你的「par」變量包含一個如下所示的字符串:「(100,98)」,這就是爲什麼它不能解析。

+0

我不明白它是如何做到的。當我輸出「par」作爲純文本時,它不包含偏旁。 – Robin

+0

你確定嗎?它包含了括號,當我嘗試它o.O – chinabuffet

+0

我發現我的代碼中的其他東西是刪除的鬼臼。在將Rexex改爲只輸出數字後,它仍然不會解析它。 – Robin

0

您可以嘗試 - 基於InvariantCulture

var culture = CultureInfo.InvariantCulture; 
double result = double.Parse(par , culture); 
0

您可以強制double.Parse用採用,作爲小數點分隔文化,像這樣:

CultureInfo culture = new CultureInfo("de-DE"); 
double d = double.Parse(par, culture); 

這是個好無論如何,如果你想讓你的程序也可以在具有不同區域設置的計算機上工作的話。

+0

當我輸入「CurrentCulture」時,它說它找不到類型或名稱空間。我必須輸入「using.something」嗎?使用這個? – Robin

+0

'使用System.Globalization;'但我犯了一個錯誤(這是一個CultureInfo,而不是CurrentCulture ...) –

+0

即使現在,它也不會接受輸入。顯然它不是逗號。 – Robin

1

改變你的正則表達式來(?<=\()(([^)]*))(?=\))

0

您正則表達式設置爲(?<=\()(([^)]*))(?=\))並使用該助手應該解決您的問題:

 public static double ParseDouble(string input) 
     { 
      // unify string (no spaces, only .) 
      string output = input.Trim().Replace(" ", "").Replace(",", "."); 

      // split it on points 
      string[] split = output.Split('.'); 

      if (split.Count() > 1) 
      { 
       // take all parts except last 
       output = String.Join("", split.Take(split.Count() - 1).ToArray()); 

       // combine token parts with last part 
       output = String.Format("{0}.{1}", output, split.Last()); 
      } 

      // parse double invariant 
      double d = Double.Parse(output, CultureInfo.InvariantCulture); 
      return d; 
     } 
+0

如何在我的代碼中執行此操作?我可以將它放在」while「中嗎? – Robin

+0

不,您必須將其放在裏面相同的類或者像「助手」之類的新類中的獨立.cs文件 –

0

我做了工作,通過做一個嘗試,抓:

string par = Regex.Match(line, @"(?<=\()(([^)]*))(?=\))").Value; 
       try 
       { 
        double par2 = double.Parse(par); 
        res += par2; 
       } 
       catch 
       { 
       } 

謝謝大家的幫助。

相關問題