C#Regex.Match为十进制

时间:2012-06-12 10:33:55

标签: c# regex 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());
}

这导致“输入字符串格式不正确”。有什么想法吗?

感谢。

3 个答案:

答案 0 :(得分:3)

我看到这里发生了两件可能有所贡献的事情。

您正在将Regex Match视为一个字符串,但Match检索的是MatchGroup。

您需要查看rownum,而不是将rownum.Groups[0]转换为字符串。

其次,您没有用于捕获的括号匹配。 @"(\-?\d+\.+?\d+)%"将从整个批次创建一个捕获组。这可能无关紧要,我不知道C#在这种情况下的表现如何,但是如果你开始拉伸你的正则表达式,你将需要使用括号中的捕获组,这样你就可以开始想要继续。

答案 1 :(得分: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
}

答案 2 :(得分:1)

如果您要使用Match类来处理此问题,则必须访问Match.Groups属性以获取匹配集合。此类假定出现多个事件。如果你可以保证你总是得到1而且只有1你可以得到它:

string act = rownum.Groups[0];

否则,您需要像MSDN documentation一样解析它。