为什么此代码导致ArgumentOutOfRangeException?

时间:2013-12-16 06:04:01

标签: c#

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

当我测试它时,我第一次编辑它没有错误的分数并且工作正常但是第二次我改变它的错误部分中的某些东西。我收到此错误

  

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));
                }
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

从您提供的代码我可以看出您的Substring方法之一会引发此异常。所以它可能有无效的第二个参数(它小于0或高于字符串长度)。检查msdn以获取详细信息:http://msdn.microsoft.com/ru-ru/library/aka44szs%28v=vs.110%29.aspx

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

答案 1 :(得分:0)

使用yourDoubleExpr.ToString("P4")将数字转换为百分比字符串。乘以100.0是自动的。

您的问题是像(3.0 / 4.0).ToString()这样的情况会导致短字符串,例如"0.75",而您无法从中获取.Substring长度6