【问题标题】:Check input is between range of numbers -in C#检查输入是否在数字范围之间 - 在 C# 中
【发布时间】:2017-06-28 10:53:30
【问题描述】:

在控制台应用程序中,我试图检查年份的输入值是否在 1-10 之间。

目前我也在使用以下方法检查输入是否为有效的 int。

int numberOfYears;

Console.WriteLine("Enter the number of years:");
string numberOfYearsInput = Console.ReadLine();

while (!Int32.TryParse(numberOfYearsInput, out numberOfYears))
{
    Console.WriteLine("Not a valid ammount, try again.");

    numberOfYearsInput = Console.ReadLine();
}

我已尝试将其更改为:

while (!Int32.TryParse(numberOfYearsInput, out numberOfYears))
{
    Console.WriteLine("Not a valid ammount, try again.");

    numberOfYearsInput = Console.ReadLine();

    if (numberOfYears < 1 || numberOfYears > 10)
    {
        Console.WriteLine("Not a valid ammount, try again.");

        numberOfYearsInput = Console.ReadLine();   
    }
}

但是,这会导致输入值不正确。我怎样才能把它结合起来让它工作?

编辑

已更改为以下,仍然允许 11、12 等作为有效输入

Console.WriteLine("Enter the number of years:");
string numberOfYearsInput = Console.ReadLine();

while (!Int32.TryParse(numberOfYearsInput, out numberOfYears))
{
    Console.WriteLine("Not a valid ammount, try again.");

    numberOfYearsInput = Console.ReadLine();

    if (numberOfYears >= 1 && numberOfYears <= 10)
    {
         Console.WriteLine("Not a valid ammount, try again.");

         numberOfYearsInput = Console.ReadLine();
    }
}

【问题讨论】:

  • 问题是 11 是一个有效的整数,所以通过了 while 循环
  • ` if (numberOfYears >1 || numberOfYears

标签: c# console


【解决方案1】:

我认为这种任务应该由 oop 标准来完成,例如

    public static bool BetweenRanges(int a,int b,int number)
    {
        return (a <= number && number <= b);
    }
    static void Main(string[] args)
    {

        Console.WriteLine("Enter the number of years:");
        int numberOfYearsInput = Convert.ToInt16(Console.ReadLine());

        while (!BetweenRanges(1,10, numberOfYearsInput))
        {
            Console.WriteLine("Not a valid ammount, try again.");
            numberOfYearsInput = Convert.ToInt16(Console.ReadLine());
        }
    }

在这种情况下,您可以在更多地方使用BetweenRange,并使用任何类型的数字。代码更干净,更易于理解,在这种情况下可能并不重要,但它是最佳实践。 (当你的代码增长时会很容易理解)

如果是文本输入,您可以检查它并告诉用户不允许输入文本:

    public static bool BetweenRanges(int a, int b, int number)
    {
        return (a <= number && number <= b);
    }
    static void Main(string[] args)
    {
        bool notValid = true;

        while (notValid)
        {
            try
            {
                Console.WriteLine("Enter the number of years:");
                int numberOfYearsInput = Convert.ToInt16(Console.ReadLine());

                while (!BetweenRanges(1, 10, numberOfYearsInput))
                {
                    Console.WriteLine("Not a valid ammount, try again.");
                    numberOfYearsInput = Convert.ToInt16(Console.ReadLine());
                }

                notValid = false;
            }
            catch
            {
                Console.WriteLine("Text is not valid ammount, try again.\n");
            }
        }
    }

【讨论】:

  • 感谢 Leon,但不幸的是,如果用户输入文本等,这会中断,这也是我的要求。
  • 尝试第二个选项(告诉用户不允许使用文本)
【解决方案2】:

在 if 语句中,您使用“||”,但这是一个布尔 OR,您需要使用“AND”语句。此外,您的较小/较大运算符是倒置的,因此给您以下语句:

如果 numberOfYears 小于 1 或 numberOfYears 大于 10

如果你想检查数字是否在 1 到 10 之间,该行应该是这样的:

if (numberOfYears >= 1 && numberOfYears <= 10)

'&amp;&amp;' 是布尔值'AND' 运算符 '&gt;=''&lt;=' 分别大于/小于或等于。

因此它检查 numberOfYears 是否大于或等于 1 并且小于或等于 10。

【讨论】:

  • 谢谢,但它仍然允许 11 作为有效输入
【解决方案3】:

试试这个

        int numberOfYears;
        Console.WriteLine("Enter the number of years:");
        string numberOfYearsInput = Console.ReadLine();
        bool result = false;

        while (!result)
        {
            if (Int32.TryParse(numberOfYearsInput, out numberOfYears))
            {
                if (numberOfYears < 1 || numberOfYears > 10)
                {
                    Console.WriteLine("Not a valid ammount, try again.");

                    numberOfYearsInput = Console.ReadLine();
                }
                else
                {
                    result = true;
                    Console.WriteLine("Correct Number");
                    Console.ReadKey(true);
                    //Do your code here
                }
            }
            else
            {
                Console.WriteLine("Not a valid number, try again.");
                numberOfYearsInput = Console.ReadLine();
            }
        }

【讨论】:

  • 谢谢,但我认为使用 goto 不是最佳做法。
  • 我也认为你应该避免goto
  • 对不起,我以为问题是初学者的问题,现在我编辑了我的代码
【解决方案4】:

问题出在这行代码while (!Int32.TryParse(numberOfYearsInput, out numberOfYears)),因为它传递了所有有效数字并仅在输入不是有效数字时才进入循环。

尝试使用这段代码,让我知道它是否适合你

       int numberOfYears;

        while (true)
        {
            Console.WriteLine("Not a valid ammount, try again.");
            if (!Int32.TryParse(Console.ReadLine(), out numberOfYears))
                continue;

            if (numberOfYears >= 1 && numberOfYears <= 10)
            {
                Console.WriteLine("Valid value");
                break;
            }
        }

【讨论】:

    【解决方案5】:

    它允许错误输入的原因是因为您使用的是 OR 操作数 (||)。

    这基本上告诉编译器年份需要高于 1 OR 低于 10。

    所以如果你添加一个数字,比如 100,它实际上被评估为真,因为它在 if 语句条件的左侧成立。 (大于 1)。

    所以改成:

    public static void Main()
    {
        int numberOfYears = GetYears();
    
        Console.WriteLine("Good work, years = " + numberOfYears);
    }
    
    public static int GetYears()
    {
        Console.WriteLine("Enter the number of years:");
    
        string inputYears = Console.ReadLine();
        int years;
    
        while(!(Int32.TryParse(inputYears, out years)) 
              || (years < 1  || years > 10))               
        {
            Console.WriteLine("Not a valid ammount, higher than 1, lower than 10!"); 
            Console.WriteLine("Please enter a new number");
            inputYears = Console.ReadLine(); 
        } 
    
        return years;
    }
    

    这是一个小提琴,其中包含 cmets 中所要求的问题的解决方案:Fiddle

    【讨论】:

    • 如果总是假的
    • 你在说什么?这怎么可能总是假的?我刚刚在VS中测试过。只要变量高于 1 且低于 10(如要求),它将为 true,否则为 false。看看这个fiddle
    • 假设你的号码是 5 然后 if(false&&false)
    • 刚刚意识到我设置了错误的等号。你是对的。已编辑。
    • 谢谢,但它仍然允许 11 作为有效输入
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    相关资源
    最近更新 更多