C# Regex.Match to decimal

本文关键字:decimal to Match Regex | 更新日期: 2023-09-27 18:36:49

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

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

谢谢。

C# Regex.Match to decimal

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

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

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

其次,您没有要捕获的括号匹配项。 @"('-?'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 文档中一样对其进行分析。