C# 为什么此代码会导致ArgumentOutOfRangeException?

C# 为什么此代码会导致ArgumentOutOfRangeException?,c#,C#,我正在构建一个将分数转换为百分比的应用程序。我希望这样,如果我编辑分数中的文本,它会刷新并重新计算百分比 当我测试它时,第一次编辑分数时,它不会出错,工作正常,但第二次修改分数时,它会出错。我得到这个错误 mscorlib.dll中发生System.ArgumentOutOfRangeException类型的未处理异常 我能做些什么来解决这个问题 我对C#还比较陌生,所以如果可能的话,试着让它安静下来 其他信息:索引和长度必须引用字符串中的位置。” 以下是我目前掌握的情况: private vo

我正在构建一个将分数转换为百分比的应用程序。我希望这样,如果我编辑分数中的文本,它会刷新并重新计算百分比

当我测试它时,第一次编辑分数时,它不会出错,工作正常,但第二次修改分数时,它会出错。我得到这个错误

mscorlib.dll中发生System.ArgumentOutOfRangeException类型的未处理异常

我能做些什么来解决这个问题

我对C#还比较陌生,所以如果可能的话,试着让它安静下来

其他信息:索引和长度必须引用字符串中的位置。”

以下是我目前掌握的情况:

private void fractionNumerator_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (!(char.IsNumber(e.KeyChar) || ((e.KeyChar) == Convert.ToChar(Keys.Back))))
        {
            e.Handled = true;
        }
        else
        {
            if (!((fractionNumerator.Text == "") && (fractionDenominator.Text == "")))
            {
                if ((e.KeyChar == Convert.ToChar(Keys.Back)))
                {
                    string numer = (fractionNumerator.Text.Substring(0, (fractionNumerator.Text.Length) - 1));
                    string denom = (fractionDenominator.Text);
                    outputPercentage.Text = (((((Convert.ToDouble(numer) / Convert.ToDouble(denom)) * 100).ToString()).Substring(0, 6)) + "%");
                }
                else
                {
                    string numer = ((fractionNumerator.Text) + e.KeyChar.ToString());
                    string denom = (fractionDenominator.Text);
                    outputPercentage.Text = (((Convert.ToDouble(numer)/Convert.ToDouble(denom)*100).ToString()).Substring(0, 6));
                }
            }
        }
    }

    private void fractionDenominator_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (!(char.IsNumber(e.KeyChar) || ((e.KeyChar) == Convert.ToChar(Keys.Back))))
        {

            e.Handled = true;
        }
        else
        {
            if (!((fractionNumerator.Text == "") && (fractionDenominator.Text == "")))
            {
                if ((e.KeyChar == Convert.ToChar(Keys.Back)))
                {
                    string denom = (fractionDenominator.Text.Substring(0, (fractionDenominator.Text.Length) - 1));
                    string numer = (fractionNumerator.Text);
                    outputPercentage.Text = (((((Convert.ToDouble(numer) / Convert.ToDouble(denom)) * 100).ToString()).Substring(0, 6)) + "%");
                }
                else
                {
                    string denom = ((fractionDenominator.Text) + e.KeyChar.ToString());
                    string numer = (fractionNumerator.Text);
                    outputPercentage.Text = (((Convert.ToDouble(numer) / Convert.ToDouble(denom) * 100).ToString()).Substring(0, 6));
                }
            }
        }
    }

从您提供的代码中,我可以看出您的
子字符串
方法之一引发了此异常。因此,它可能具有无效的第二个参数(小于0或大于字符串长度)。有关详细信息,请查看msdn:


正如mike z的评论中所提到的,您应该使用格式化字符串而不是
子字符串
方法来格式化输出。例如
doubleValue.ToString(“#.######”)将返回小数部分的4位。

使用
您的DoubleExpr.ToString(“P4”)
将数字转换为百分比字符串。与
100.0的乘法是自动的


你的问题是像
(3.0/4.0)这样的情况。ToString()
会导致一个短字符串,比如
“0.75”
,你不能从中取出长度为
6
子字符串。

你在哪一行出错了?我猜是
子字符串(0,6))
,以某种方式对少于6个字符的字符串调用它。它是
子字符串
调用之一。停止使用子字符串格式化双输出。使用格式说明符: