我怎样才能validation控制台input为整数?

我已经写了我的代码,我想validation它的方式,它只会允许插入input而不是字母。 这里是代码,请我爱你来帮助我。 谢谢。

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace minimum { class Program { static void Main(string[] args) { int a = Convert.ToInt32(Console.ReadLine()); int b = Convert.ToInt32(Console.ReadLine()); int c = Convert.ToInt32(Console.ReadLine()); if (a < b) { if (a < c) { Console.WriteLine(a + "is the minimum number"); } } if (b < a) { if (b < c) { Console.WriteLine(b + "is the minimum number"); } } if (c < a) { if (c < b) { Console.WriteLine(c + "is the minimum number"); } } Console.ReadLine(); } } } 

你应该testing,如果它是一个int而不是立即转换。 尝试像这样:

 string line = Console.ReadLine(); int value; if (int.TryParse(line, out value)) { // this is an int // do you minimum number check here } else { // this is not an int } 

只需调用Readline()并用Int.TryParse循环,直到用户input一个有效的数字:)

 int X; String Result = Console.ReadLine(); while(!Int32.TryParse(Result, out X)) { Console.WriteLine("Not a valid number, try again."); Result = Console.ReadLine(); } 

希望有所帮助

为了让控制台过滤出按字母顺序排列的击键,你必须接pipeinputparsing。 Console.ReadKey()方法是基本的,它可以让你嗅探按下的键。 以下是一个示例实现:

  static string ReadNumber() { var buf = new StringBuilder(); for (; ; ) { var key = Console.ReadKey(true); if (key.Key == ConsoleKey.Enter && buf.Length > 0) { return buf.ToString() ; } else if (key.Key == ConsoleKey.Backspace && buf.Length > 0) { buf.Remove(buf.Length-1, 1); Console.Write("\b \b"); } else if ("0123456789.-".Contains(key.KeyChar)) { buf.Append(key.KeyChar); Console.Write(key.KeyChar); } else { Console.Beep(); } } } 

您可以在检测到Enter键的if()语句中添加Decimal.TryParse(),以validationinput的string是否仍然是有效的数字。 这样你可以拒绝像“1-2”这样的input。

不要立即转换来自用户的input。 把它放在一个string中,并使用Int32.TryParse(…)来确定是否input了一个数字。 喜欢这个:

 int i; string input = Console.ReadLine(); if(Int32.TryParse(input, out i)) { // it is a number and it is stored in i } else { // it is not a number } 

注意

 if (a < b) { if (a < c) { 

相当于

 if (a < b && a < c) { 

而后一种forms的嵌套更less,更具可读性,特别是在代码变得更复杂的情况下。 此外,你可能应该使用Convert.ToInt32 – 它有一个特别糟糕的构思和令人惊讶的angular落案例; 而且它的types安全性要低于int.Parse ,在可能的情况下这是最好的select – 或者当你不确定string是否有效的时候使用int.TryParse 。 基本上,尽可能避免Convert....

  string Temp; int tempInt,a; bool result=false; while ( result == false ) { Console.Write ("\n Enter A Number : "); Temp = Console.ReadLine (); result = int.TryParse (Temp, out tempInt); if ( result == false ) { Console.Write ("\n Please Enter Numbers Only."); } else { a=tempInt; break; } } 

我的首选解决scheme是:

 static void Main() { Console.WriteLine( ( from line in Generate(()=>Console.ReadLine()).Take(3) let val = ParseAsInt(line) where val.HasValue select val.Value ).Min() ); } static IEnumerable<T> Generate<T>(Func<T> generator) { while(true) yield return generator(); } static int? ParseAsInt(string str) { int retval; return int.TryParse(str,out retval) ? retval : default(int?); } 

当然,根据规范(应该重试无效的数字?),它可能需要调整。

双人/浮动:

我只是扩展@Hans Passant答案(照顾DecimalSeparator和“ – ”):

  static double ReadNumber() { var buf = new StringBuilder(); for (; ; ) { var key = Console.ReadKey(true); if (key.Key == ConsoleKey.Enter && buf.Length > 0) { Console.WriteLine(); return Convert.ToDouble(buf.ToString()); } else if (key.Key == ConsoleKey.Backspace && buf.Length > 0) { buf.Remove(buf.Length - 1, 1); Console.Write("\b \b"); } else if (System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator.Contains(key.KeyChar) && buf.ToString().IndexOf(System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator) == -1) { buf.Append(key.KeyChar); Console.Write(key.KeyChar); } else if ("-".Contains(key.KeyChar) && buf.ToString().IndexOf("-") == -1 && buf.ToString() == "") { buf.Append(key.KeyChar); Console.Write(key.KeyChar); } else if ("0123456789".Contains(key.KeyChar)) { buf.Append(key.KeyChar); Console.Write(key.KeyChar); } else { Console.Beep(); } } } 

试试这个简单

 try { string x= "aaa"; Convert.ToInt16(x); //if success is integer not go to catch } catch { //if not integer return; }