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());
}
这会导致"输入字符串格式不正确"。有什么想法吗?
谢谢。
我看到这里发生了两件事,可能会有所贡献。
您将正则表达式匹配视为您希望它是一个字符串,但匹配检索的是匹配组。
您需要查看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 文档中一样对其进行分析。