startIndex不能大于字符串的长度 - 在计算零时发生

时间:2015-07-01 18:21:19

标签: c# winforms

decimal n = str.Split('.')[0].Substring(2).Where(d => d == '0').Count(s => s == '0');

我正在尝试这样做,以便我可以将代码输入到文本框中并计算零。无论我插入什么,都会乘以1,000,000。但是当首先输入零时。

实施例: 0.12 012.0 072 0.085

我的程序会崩溃并给我这个错误:“startIndex不能大于字符串的长度。”它崩溃了我先放入零的第二个。

这些是有用的: 12.0 850 0.82 5.6 等等,只要它不是0.任何修正?

这是我的所有代码:

private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (uFCheckBox.Checked == true)
            {
                nFCheckBox.Checked = false;
                pFCheckBox.Checked = false;
                decimal x = 0;
                if (Decimal.TryParse(textBox1.Text, out x))
                {
                    var y = 1000000;
                    var answer = x * y;

                    displayLabel2.Text = (x.ToString().Replace(".", "").TrimStart(new Char[] { '0' }) + "00").Substring(0, 2);

                    var str = answer.ToString();
                    //decimal n = str.Split('.')[0].Substring(2, str.Length - 2).Count( s => s == '0');
                    //decimal n = str.Split('.')[0].Substring(2, str.Length - 2).Where(d => d == '0').Count(s => s == '0');
                    //decimal n = str.Split('.')[0].Where(d => d == '0').Count(s => s == '0');
                    decimal n = str.Split('.')[0].Substring(2).Where(d => d == '0').Count(s => s == '0');

                   displayLabel5.Text = n.ToString();
                }
                else
                {
                    displayLabel2.Text = "error";
                }
            }

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为您正在尝试获取字符串的计数,并且该计数依赖于字符串长度至少为2个字符。

既然你知道它是不是2个字符,你不需要任何零,你就可以调整你的代码:

private void textBox1_TextChanged(object sender, EventArgs e)
    {
        if (uFCheckBox.Checked == true)
        {
            nFCheckBox.Checked = false;
            pFCheckBox.Checked = false;
            decimal x = 0;
            if (Decimal.TryParse(textBox1.Text, out x))
            {
                var y = 1000000;
                var answer = x * y;
                displayLabel2.Text = (x.ToString().Replace(".", "").TrimStart(new Char[] { '0' }) + "00").Substring(0, 2);

                var str = answer.ToString();
                //decimal n = str.Split('.')[0].Substring(2, str.Length - 2).Count( s => s == '0');
                //decimal n = str.Split('.')[0].Substring(2, str.Length - 2).Where(d => d == '0').Count(s => s == '0');
                //decimal n = str.Split('.')[0].Where(d => d == '0').Count(s => s == '0');

                string splitString = str.Split('.')[0];
                if(splitString.Length <= 2)
                {
                    displayLabel5.Text = "0";
                }
                else
                {
                    decimal n = str.Split('.')[0].Substring(2).Where(d => d == '0').Count(s => s == '0');

                   displayLabel5.Text = n.ToString();
                }
            }
            else
            {
                displayLabel2.Text = "error";
            }
        }
    }

这会在开头添加初始检查,如果文本框中字符串的长度小于或等于2,则自动将标签设置为0,否则开始评估