[英]C# Regex.Match to decimal
我有一個字符串“ -4.00%”,我需要將其轉換為小數,以便可以將其聲明為變量並在以后使用。 字符串本身可以在string []行中找到。 我的代碼如下:
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());
}
這導致“輸入字符串的格式不正確”。 有任何想法嗎?
謝謝。
我看到這里發生的兩件事可能會有所幫助。
您正在對待正則表達式匹配,就好像您希望它是一個字符串一樣,但是匹配檢索到的是匹配組。
無需將rownum
轉換為字符串,而是需要查看rownum.Groups[0]
。
其次,您沒有要捕獲的括號匹配項。 @"(\\-?\\d+\\.+?\\d+)%"
將根據整個批次創建一個捕獲組。 這可能無關緊要,我不知道C#在這種情況下的表現如何,但是如果您開始擴展正則表達式,則將需要使用方括號括起的捕獲組,因此您不妨繼續進行下去。
這是代碼的修改后的版本,可將正則表達式更改為使用捕獲組並顯式查找%
。 結果,這也將解析簡化為十進制(不再需要中間字符串):
編輯: 根據執行者的建議檢查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
}
如果要使用Match
類來處理此問題,則必須訪問Match.Groups
屬性以獲取匹配項集合。 此類假定出現了多個事件。 如果可以保證總是得到1,而只有1,則可以使用以下方法獲得它:
string act = rownum.Groups[0];
否則,您將需要像MSDN文檔中一樣對其進行解析。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.