从用户输入读取整数


75

我正在寻找的是如何读取用户从命令行(控制台项目)给出的整数。我主要了解C ++,并且已经开始使用C#路径。我知道Console.ReadLine(); 只需要一个字符/字符串。简而言之,我正在寻找此的整数版本。

只是让您大致了解我在做什么:

Console.WriteLine("1. Add account.");
Console.WriteLine("Enter choice: ");
Console.ReadLine(); // Needs to take in int rather than string or char.

我已经为此寻找了很长一段时间。我在C上找到了很多东西,但在C#上却找不到。但是,我确实在另一个站点上发现了一个建议从char转换为int的线程。我敢肯定必须有比转换更直接的方法。


1
我认为您不会使用的整数版本ReadLine,应该将返回值保存在其中,string然后尝试将其转换为int(可能Int32.TryParse带有或其他ans try / catch),如果没有输入int,请提示用户再次尝试。
2014年

2
更好的方法是将输入输入字符串变量,然后int.TryParse用于转换。
哈桑2014年

Answers:


124

您可以使用Convert.ToInt32()函数将字符串转换为整数

int intTemp = Convert.ToInt32(Console.ReadLine());

4
太神奇了,我之前曾经尝试过,但是没有用。但是只是再次尝试,它确实...感谢Console.WriteLine(“ 1。Add account。”); Console.WriteLine(“输入选择:”); int选择= Convert.ToInt32(Console.ReadLine()); if(choice == 1)//依此类推。这工作了。将标记为答案。
TomG 2014年

1
这个答案是完全错误的。如果用户输入的数字不是数字,则Convert.ToInt32或Int32.Parse将失败,并发生异常。当您不能保证输入为数字时,请始终使用Int32.TryParse。
史蒂夫

62

我建议您使用TryParse

Console.WriteLine("1. Add account.");
Console.WriteLine("Enter choice: ");
string input = Console.ReadLine();
int number;
Int32.TryParse(input, out number);

这样,如果您尝试解析“ 1q”或“ 23e”之类的内容,则应用程序不会引发异常,因为有人输入了错误的内容。

Int32.TryParse返回一个布尔值,因此您可以在if语句中使用它,以查看是否需要分支代码:

int number;
if(!Int32.TryParse(input, out number))
{
   //no, not able to parse, repeat, throw exception, use fallback value?
}

您的问题:由于ReadLine()读取整个命令行,因此不会找到读取整数的解决方案,threfor返回一个字符串。您可以做的是,尝试将此输入转换为int16 / 32/64变量。

有几种方法可以做到这一点:

如果您不确定要转换的输入,请始终使用TryParse方法,无论您尝试解析字符串,int变量还是什么都不解析。

在C#7.0中,在变量作为参数传入的地方可以直接声明Update,因此可以将上面的代码压缩为:

if(Int32.TryParse(input, out int number))
{
   /* Yes input could be parsed and we can now use number in this code block 
      scope */
}
else 
{
   /* No, input could not be parsed to an integer */
}

一个完整的示例如下所示:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
        var foo = Console.ReadLine();
        if (int.TryParse(foo, out int number1)) {
            Console.WriteLine($"{number1} is a number");
        }
        else
        {
            Console.WriteLine($"{foo} is not a number");
        }
        Console.WriteLine($"The value of the variable {nameof(number1)} is {number1}");
        Console.ReadLine();
    }
}

在这里您可以看到,number1即使输入不是数字,并且变量的值始终为0 ,该变量的确会被初始化,因此即使在声明if块之外也有效


2
赞成。int.TrypParse是更好的解决方案。如果您添加条件或bool变量来解析结果,则@Serv会很好。那应该证明使用int.TryParse是合理的。
哈桑2014年

1
好的答案,但是整个事情可以简化为单行:if(!Int32.TryParse(Console.ReadLine(),out int input)){//处理无效输入}
Andrew

9

您需要转换输入。尝试使用以下

int input = Convert.ToInt32(Console.ReadLine()); 

如果值为非数字,它将引发异常。

编辑

我了解以上是一个快速的步骤。我想改善我的答案:

String input = Console.ReadLine();
int selectedOption;
if(int.TryParse(input, out selectedOption))
{
      switch(selectedOption) 
      {
           case 1:
                 //your code here.
                 break;
           case 2:
                //another one.
                break;
           //. and so on, default..
      }

} 
else
{
     //print error indicating non-numeric input is unsupported or something more meaningful.
}

5
int op = 0;
string in = string.Empty;
do
{
    Console.WriteLine("enter choice");
    in = Console.ReadLine();
} while (!int.TryParse(in, out op));

1
这个答案应该在列表中更多。这是处理错误输入并让用户重试而不会引发任何异常的唯一方法。我只会删除string.Empty分配。
Andrew

3

我使用过int intTemp = Convert.ToInt32(Console.ReadLine());并且效果很好,这是我的示例:

        int balance = 10000;
        int retrieve = 0;
        Console.Write("Hello, write the amount you want to retrieve: ");
        retrieve = Convert.ToInt32(Console.ReadLine());

3

对于您的问题,我没有一个好的完整的答案,因此,我将展示一个更完整的示例。张贴了一些方法,显示了如何从用户获取整数输入,但是每当执行此操作时,通常还需要

  1. 验证输入
  2. 如果给出了无效的输入,则显示一条错误消息,并且
  3. 循环直到给出有效输入。

本示例说明如何从用户那里获得等于或大于1的整数值。如果给出了无效输入,它将捕获错误,显示错误消息,并要求用户再次尝试正确的输入。

static void Main(string[] args)
    {
        int intUserInput = 0;
        bool validUserInput = false;

        while (validUserInput == false)
        {
            try
            { Console.Write("Please enter an integer value greater than or equal to 1: ");
              intUserInput = int.Parse(Console.ReadLine()); //try to parse the user input to an int variable
            }  
            catch (Exception) { } //catch exception for invalid input.

            if (intUserInput >= 1) //check to see that the user entered int >= 1
              { validUserInput = true; }
            else { Console.WriteLine("Invalid input. "); }

        }//end while

        Console.WriteLine("You entered " + intUserInput);
        Console.WriteLine("Press any key to exit ");
        Console.ReadKey();
    }//end main

在您的问题中,您似乎想将其用于菜单选项。因此,如果您想获取用于选择菜单选项的int输入,则可以将if语句更改为

if ( (intUserInput >= 1) && (intUserInput <= 4) )

如果您需要用户选择1、2、3或4的选项,这将起作用。


在用户输入周围引发异常而没有至少测试一个值TryParse是进行用户输入验证的一种昂贵方法
Mark Schultheiss

2

更好的方法是使用TryParse:

Int32 _userInput;
if(Int32.TryParse (Console.Readline(), out _userInput) {// do the stuff on userInput}


0
static void Main(string[] args)
    {
        Console.WriteLine("Please enter a number from 1 to 10");
        int counter = Convert.ToInt32(Console.ReadLine());
        //Here is your variable
        Console.WriteLine("The numbers start from");
        do
        {
            counter++;
            Console.Write(counter + ", ");

        } while (counter < 100);

        Console.ReadKey();

    }

0

试试这个不会抛出异常,用户可以再试一次:

        Console.WriteLine("1. Add account.");
        Console.WriteLine("Enter choice: ");
        int choice = 0;
        while (!Int32.TryParse(Console.ReadLine(), out choice))
        {
            Console.WriteLine("Wrong input! Enter choice number again:");
        }

0

您可以创建自己的ReadInt函数,该函数仅允许数字(此函数可能不是实现此目的的最佳方法,但可以完成此工作)

public static int ReadInt()
    {
        string allowedChars = "0123456789";

        ConsoleKeyInfo read = new ConsoleKeyInfo();
        List<char> outInt = new List<char>();

        while(!(read.Key == ConsoleKey.Enter && outInt.Count > 0))
        {
            read = Console.ReadKey(true);
            if (allowedChars.Contains(read.KeyChar.ToString()))
            {
                outInt.Add(read.KeyChar);
                Console.Write(read.KeyChar.ToString());
            }
            if(read.Key == ConsoleKey.Backspace)
            {
                if(outInt.Count > 0)
                {
                    outInt.RemoveAt(outInt.Count - 1);
                    Console.CursorLeft--;
                    Console.Write(" ");
                    Console.CursorLeft--;
                }
            }
        }
        Console.SetCursorPosition(0, Console.CursorTop + 1);
        return int.Parse(new string(outInt.ToArray()));
    }

-1

您可以继续尝试:

    Console.WriteLine("1. Add account.");
    Console.WriteLine("Enter choice: ");
    int choice=int.Parse(Console.ReadLine());

这应该适用于案例陈述。

它与switch语句一起使用,不会引发异常。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.