C#-输入字符串的格式不正确

C#-输入字符串的格式不正确,c#,C#,我正在开发一个简单的windows窗体应用程序,用户输入一个带分隔符的字符串,我解析该字符串,只从字符串中获取变量。 例如,如果用户输入: 2X + 5Y + z^3 我从“方程式”中提取值2、5和3,然后简单地将它们相加 这就是我如何从字符串中获取整数值的方法 int thirdValue string temp; temp = Regex.Match(variables[3], @"\d+").Value thirdValue = int.Parse(temp); 变量只是一个字符串数组

我正在开发一个简单的windows窗体应用程序,用户输入一个带分隔符的字符串,我解析该字符串,只从字符串中获取变量。 例如,如果用户输入:

2X + 5Y + z^3
我从“方程式”中提取值2、5和3,然后简单地将它们相加

这就是我如何从字符串中获取整数值的方法

int thirdValue
string temp;
temp = Regex.Match(variables[3], @"\d+").Value
thirdValue = int.Parse(temp);
变量
只是一个字符串数组,我用来在解析后存储字符串

但是,我在运行应用程序时遇到以下错误:

输入字符串的格式不正确


您可以将字符串更改为char数组,并检查其是否为数字,然后将其计数

        string temp = textBox1.Text;
        char[] arra = temp.ToCharArray();
        int total = 0;
        foreach (char t in arra)
        {
            if (char.IsDigit(t))
            {
                total += int.Parse(t + "");
            }
        }
        textBox1.Text = total.ToString();

这将解决您的问题:

string temp;
temp = Regex.Matches(textBox1.Text, @"\d+", RegexOptions.IgnoreCase)[2].Value;
int thirdValue = int.Parse(temp);

我更喜欢没有正则表达式的简单轻量级解决方案:

static class Program
{
    static void Main()
    {
        Console.WriteLine("2X + 65Y + z^3".GetNumbersFromString().Sum());
        Console.ReadLine();
    }

    static IEnumerable<int> GetNumbersFromString(this string input)
    {
        StringBuilder number = new StringBuilder();
        foreach (char ch in input)
        {
            if (char.IsDigit(ch))
                number.Append(ch);                
            else if (number.Length > 0)
            {
                yield return int.Parse(number.ToString());
                number.Clear();
            }
        }
        yield return int.Parse(number.ToString());
    }
}
静态类程序
{
静态void Main()
{
Console.WriteLine(“2X+65Y+z^3”.GetNumbersFromString().Sum());
Console.ReadLine();
}
静态IEnumerable GetNumbersFromString(此字符串输入)
{
StringBuilder编号=新的StringBuilder();
foreach(输入中的字符ch)
{
if(字符IsDigit(ch))
编号。追加(ch);
否则如果(number.Length>0)
{
返回int.Parse(number.ToString());
number.Clear();
}
}
返回int.Parse(number.ToString());
}
}

为什么我要让每个人都抱怨这个问题并记下来?解释正在发生的事情非常容易,提问者这样说是对的。没有什么不对的

Regex.Match(variables[3], @"\d+").Value
抛出格式不正确的
输入字符串。
FormatException(如果字符串(此处为
变量[3]
)不包含任何数字)当作为服务运行时,如果无法访问数组内存堆栈中的
变量[3]
,它也会这样做。我怀疑这是一个BUG
错误是
.Value
为空,而
.Match
失败

老实说,如果你问我的话,这是一个伪装成bug的特性,但它应该是一个设计特性。完成此方法的正确方法(IMHO)是返回一个空白字符串。但它们不会抛出一个格式化异常。想想看,
astef
建议您甚至不要麻烦使用正则表达式,因为它会抛出异常并令人困惑。但他也被扣分了

解决这个问题的方法是使用他们也提出的这种简单的附加方法

if (Regex.IsMatch(variables[3], @"\d+")){
   temp = Regex.Match(variables[3], @"\d+").Value
}

如果这仍然不适用于您,那么您不能使用正则表达式进行此操作。我在一个
c#服务中看到,这不起作用,并抛出错误。因此,我不得不停止使用Regex,请打印出
temp
中的值。这可能会给你一些启发。这甚至不会编译-你能展示你真正的代码吗?(Match.Value是一个
字符串
,所以你不能分配给
int-temp
,等等)确切地说,你怎么能把regex-Match分配给int?对不起,这是打字错误,temp是一个字符串。@user2301717我们还需要知道
变量[3]
中存储了什么,如果数字大于9:“2X+65Y+z^3”虽然我们需要更好地解释这项任务,以确保我同意。对于刚接触C#的人来说,这是一个合法的问题,而且这个答案信息量很大。