2009-02-02 190 views
1

噢,2件事: 1)它是一个控制台应用程序。 2)我知道这是丹麦语,但它并不重要,它只是一个要求输入的例子。文本和变量无关紧要。验证C#中readline输入的最佳方法是什么?

好吧,考虑一下这个简单的输入: 它可能是任何一种输入问题。

Console.WriteLine("Hvad er dit kundenummer: (Kun hele tal tilladt)"); 
string inputKnr = Console.ReadLine(); 
kundenummer = Convert.ToInt16(inputKnr); 

现在,如果客户输入了错误的东西呢?如一封信。 尝试&捕获将确保应用程序不会中断,但这不是我想要的解决方案。 我希望它说你做错了,再试一次。 很经典的权利?

但是,解决此问题的最佳方法是什么?我想到了这个:

bool fangetKundenummer = true; 
while (fangetKundenummer) 
{ 
Console.WriteLine("Hvad er dit kundenummer: (Kun hele tal tilladt)"); 
string inputKnr = Console.ReadLine(); 
try 
{ 
    kundenummer = Convert.ToInt16(inputKnr); 
    fangetKundenummer = false; 
} 
catch 
{ 
    Console.WriteLine("Fejl. Prøv igen"); 
} 
} 

但它似乎不是正确的方式来做到这一点。

此外,只是提及它,我正在玩的这个小应用程序有连续4个输入问题。这意味着这个令人讨厌的while()循环的4倍。

你也可以写一个函数。像这样的东西(没有理由这样做的正确方法,它只是为了说明一个概念):

static void verifyInput() 
{ 
    try 
    { 
     Console.WriteLine("question"); 
     input = Console.ReadLine(); 
     kundenummer = Convert.ToInt16(input) 
    } 
    catch 
    { 
     Console.WriteLine("Wrong. Do it over"); 
     verifyInput(); //start the function all over 
    } 
} 

但是你必须写的每一个功能,每输入一个问题,即使他们可能会问,究竟对于相同的! (也许所有人都要求一个整数;但是有一个不同的问题和变量)。

这似乎不比while()解决方案好得多。

有没有人有一个聪明的想法?

回答

9

使用Int16.TryParse及其他数字类型的等效项。所有这些都会返回一个布尔结果来指示解析成功或失败,并采用设置为解析结果的参数out(或者在失败的情况下为0)。在你的情况,你可能想包装在一个方法调用,以保持提示:

static Int16 PromptForInt16(string prompt) 
{ 
    while (true) 
    { 
     Console.Write(prompt); 
     Int16 result; 
     if (Int16.TryParse(Console.ReadLine(), out result)) 
     { 
      return result; 
     } 
     Console.WriteLine("Sorry, invalid number entered. Try again."); 
    } 
} 
+0

不完全是一个“聪明的想法”,而是正确的答案。 – 2009-02-02 14:34:04

3

可以使用的TryParse模式:

string s; // for "is not valid" message 
short val; // final value 
while(!short.TryParse(s=Console.ReadLine(), out val)) { 
    Console.WriteLine(s + " is not valid..."); 
} 
+0

在无效输入的情况下,总会写入“0无效”;) (根据我的需要,您需要一个临时字符串变量。) – 2009-02-02 14:36:08

1

只是为了一些变化,如何测试字符串本身,而不是TryParse,这将需要额外的存储空间,并可能不需要转换?

static void Main(string[] args) 
{ 
    var isFalse = "t".IsInt(); 
    var isTrue = "123".IsInt(); 
    var isAlsoFalse = "123.1".IsInt(); 

} 

static bool IsInt(this IEnumerable<char> s) 
{ 
    return s.All(x => char.IsNumber(x)); 
} 
+0

授予,但不测试字符串的长度,但您可以轻松地为其添加计数。经过快速测试后,它比TryParse稍快(5%)。 – Mark 2009-02-02 15:10:47

相关问题