【问题标题】:How do I parse an integer, using the rule that +5 is not valid but 5 is?如何使用 +5 无效但 5 有效的规则解析整数?
【发布时间】:2015-08-28 02:20:57
【问题描述】:

我的程序要求用户在文本框中输入一个从 1 到 10 的数字。当我用户输入数字时,我将其转换为 int,通过使用:

if (!int.TryParse(inputBox.Text, out input))

我使用了!,因为如果不能将数字 TryParse'd 转换为 int,则会向用户抛出错误。

这有效,直到我输入一个以+ 开头的数字,例如+5+1。在int 前面有一个+ 并没有发现这一事实。如果我输入多个+,它会抛出一个应该的错误。

有人会如何编写检查此类输入的防错代码行?

【问题讨论】:

  • 所以你是说字符串“+5”成功解析为int,对吧?
  • 是的,但是它去掉了 +,我需要一些东西在它之前捕获它并向用户抛出一个错误
  • 那是因为字符串“+5”成功解析为整数值5。你的问题是什么?
  • 为什么? +5 成功解析。
  • 是的,但这不在我希望用户输入的参数范围内。它以这种方式工作得非常好,但在这种情况下,我不希望它那样工作。我希望它抛出一个错误。

标签: c# integer error-checking


【解决方案1】:

我认为您希望允许 1-10 不带正号 (+)。

int number;
var input = numberTextBox.Text;
if (!input.StartsWith("+") && int.TryParse(input, out number))
{
    //valid input, check if it's between 1-10
}

但我觉得这个要求真的很奇怪。 “+10”被认为与“10”相同,是有效输入。

【讨论】:

  • 我喜欢这个比我见过的任何东西都多。我知道这是集市,我正在努力做到这一点,以便代码中没有打嗝。是的,它仍然是一个有效的输入,但由于它不在我想要的参数范围内,我需要它来引发用户端错误。谢谢!
  • @BryanOlesky 集市是一个封闭的市场。 en.wikipedia.org/wiki/Bazaar
  • @BryanOlesky 虽然这回答了您的确切问题,但请考虑 Preston Guillot 的回答 - 接受 -5 却拒绝 +5 是很奇怪的。
【解决方案2】:

Int32.TryParse 的重载接受 NumberStyles 值和 IFormatProvider。 - https://msdn.microsoft.com/en-us/library/zf50za27(v=vs.110).aspx

Int32.TryParse 使用的默认值是NumberStyles.Integer,它允许前导和尾随空格以及前导符号。

int.TryParse("+5", NumberStyles.None, NumberFormatInfo.InvariantInfo, out x),例如,返回 false - 但是,它也为 -5 返回 false,因为包含前导符号的选项不区分 + 和 -。这是一个提示,您可能也不应该这样做,“+5”是每个位的整数,如“5”和“-5”。

【讨论】:

    【解决方案3】:

    您可以在运行时从 textBox 中删除 + 或检查 + 字符,如下面的代码所示

    if (inputBox.Text.Contains("+"))
    {
        // throw or show message
        return;
    }
    if (!int.TryParse(inputBox.Text, out input))
    {
    }
    

    如果您想在按下时显示弹出窗口,您可以在文本框 TextChangeEvent 中检查上述条件, 或者使用按键事件来限制输入。

    【讨论】:

    • 这很好,但我希望它向用户抛出错误。
    • @BryanOlesky 欢迎您,请将其标记为解决方案
    • 对不起,我把上面的答案作为答案。它更深入。无论如何,谢谢你,我会把它添加到我的心理库中。
    • @BryanOlesky 您在哪里显示已接受答案中的消息?因为你上面提到你想显示消息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 2015-07-31
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多