0

我有一个字符串“-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());
}

这将导致“输入字符串的格式不正确”。有任何想法吗?

谢谢。

4

3 回答 3

3

我看到这里发生的两件事可能会有所帮助。

您将正则表达式匹配视为您希望它是一个字符串,但匹配检索的是一个 MatchGroup。

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

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

于 2012-06-12T10:40:41.543 回答
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
}
于 2012-06-12T10:43:00.577 回答
1

如果您打算使用Match该类来处理此问题,那么您必须访问该Match.Groups属性以获取匹配的集合。此类假定出现不止一次。如果你能保证你总是得到 1 并且只有 1 你可以得到它:

string act = rownum.Groups[0];

否则,您需要像MSDN 文档中那样解析它。

于 2012-06-12T10:39:28.457 回答