【问题标题】:startIndex cannot be larger than length of string - Happens while counting zerosstartIndex 不能大于字符串的长度 - 计数零时发生
【发布时间】:2015-07-01 18:21:18
【问题描述】:
decimal n = str.Split('.')[0].Substring(2).Where(d => d == '0').Count(s => s == '0');

我正在努力做到这一点,以便我可以在文本框中输入代码并计算零。无论我插入什么,都会乘以 1,000,000。但是当先输入一个零时。

示例: 0.12 012.0 072 .085

我的程序会崩溃并给我这个错误:“startIndex 不能大于字符串的长度。”我先输入一个零,它就会崩溃。

这些是有效的: 12.0 850 .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";
                }
            }

【问题讨论】:

  • 忽略注释掉的 3 行,这些行工作最少,错误最多
  • "0.12".Split('.')[0] == "0" 您试图在索引 2 处对结果字符串进行子串化,但结果字符串只有一个字符长。
  • 但是如果我做 str.Split('.'[0] == "0" 那么我就不能再使用子字符串了。除非我不明白你在说什么
  • 小旁注,与您的问题无关,但您可以使用以下方法计算 0 的出现次数:str.Count(c => c == '0');
  • 但我只想在我的主要数字(例如 72、10、40、50)被读取后计算零。不计算这些数字中已经存在的零。那我也想算到小数点前。如果这有任何意义

标签: c# winforms


【解决方案1】:

发生这种情况是因为您正在尝试获取字符串的计数,而该计数依赖于字符串长度至少为 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,否则开始评估

【讨论】:

  • 但是现在如果我输入“60”并且如果我输入 6.0 它仍然在计算我不想要的那个小数点。我明白你在说什么。
  • "60" 是一个主要数字,它应该产生 0 作为计数零的结果。它是如何计算 6.0 的?预期的结果是什么?
  • 6.0 x 1,000,000 结果为 6,000,000。而且我不需要它来计算第二个零。所以它应该输出5。因为无论我输入什么,主数和它后面的数都不应该被计算在内。是否为 0。像 0.007。它将被插入 a 并出现 7,200,所以它应该显示 2,如果是 70,它会出现 7,000 并且仍然显示 2
  • 查看上面对我的代码的修改。只要您没有两个前导数字,就会发生此错误。我已经检查了那些前导数字以确保它们在那里,否则在标签中输入 0(没有前导数字意味着没有零)。
  • 这完全符合我的需要。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多