2012-06-12 46 views
0

我有一個字符串「-4.00%」,我需要將其轉換爲小數,以便我可以將其聲明爲變量並稍後使用它。該字符串本身在字符串[]行中找到。我的代碼如下:C#Regex.Match to decimal

foreach (string[] row in rows) 
{ 
string row1 = row[0].ToString(); 
Match rownum = Regex.Match(row1.ToString(), @"\-?\d+\.+?\d+[^%]"); 
string act = Convert.ToString(rownum); //wouldn't convert match to decimal 
decimal actual = Convert.ToDecimal(act); 
textBox1.Text = (actual.ToString()); 
} 

這會導致「輸入字符串格式不正確」。有任何想法嗎?

謝謝。

+0

的可能重複[如何將百分比字符串轉換爲double?](http://stackoverflow.com/questions/2171615/how-to-convert-percentage-string-to-double) –

+1

假設'act'在最後包含一個帶有百分號的字符串?由於顯而易見的原因,這不能被解析爲小數。修改您的正則表達式使用捕獲組(以便捕獲值但不是百分比)並轉換捕獲的值 – WickyNilliams

+0

請參閱我的回答以獲得上述完整解決方案 – WickyNilliams

回答

2

下面是您的代碼的修改版本,它將正則表達式更改爲使用捕獲組並明確查找%。因此,這也簡化了解析,以十進制(不再需要中介字符串):

編輯:檢查rownum.Success按照執行程序的建議,在評論

string[] rows = new [] {"abc -4.01%", "def 6.45%", "monkey" }; 

foreach (string row in rows) 
{ 
    //regex captures number but not % 
    Match rownum = Regex.Match(row.ToString(), @"(\-?\d+\.+?\d+)%"); 

    //check for match 
    if(!rownum.Success) continue; 

    //get value of first (and only) capture 
    string capture = rownum.Groups[1].Value; 

    //convert to decimal 
    decimal actual = decimal.Parse(capture); 

    //TODO: do something with actual 
} 
+0

如果我錯了,請糾正我,但不是「[^%]」表示不允許'%'跟隨十進制字符串,但一切都是? – Franky

+0

正確,剛剛從上面複製正則表達式,認爲自己有點不安。我更新了正則表達式來匹配他所說的他的要求 – WickyNilliams

+0

Wicky,這對我來說非常有意義,但導致FormatException對於字符串act = rownum.Groups [1] .Value是未處理的異常。線。 – user1442073

1

如果您打算使用Match類來處理此問題,那麼您必須訪問Match.Groups屬性以獲取匹配集合。這個類假定出現多於一個的事件。

string act = rownum.Groups[0]; 

否則,你就需要通過其作爲MSDN documentation解析:如果你能保證,你永遠得到且只有1個,你可以用得到它。

3

我看到兩件事情在這裏可能有所貢獻。

您正在處理正則表達式匹配,就像您期望它是一個字符串一樣,但匹配檢索到的是MatchGroup。

與其將rownum轉換爲字符串,您需要查看rownum.Groups[0]

其次,你沒有括號匹配捕獲。 @"(\-?\d+\.+?\d+)%"將從整批中創建一個捕獲組。這可能並不重要,我不知道C#在這種情況下的行爲如何,但如果你開始擴展你的正則表達式,你會想使用括號捕獲組,所以你可以開始,因爲你想繼續。

+0

您實際上需要rownum.Groups [0] .Value (這是字符串),但+1由於很好的解釋 – executor