2009-02-02 4 views
1

О, 2 вещи: 1) Это консольное приложение. 2) Я знаю, что это на датском языке, но это на самом деле не имеет значения, это просто пример запроса на ввод. Текст и переменные не имеют значения.Лучший способ проверки ввода строки в C#?

Хорошо, рассмотрите этот простой ввод: Это может быть любой вопрос ввода на самом деле.

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

Теперь, что, если клиент называет что-то неправильно? Например, письмо. Попробуйте & catch будет следить за тем, чтобы приложение не сломалось, но это не то решение, которое я хочу. Я хочу сказать, что вы сделали это неправильно, попробуйте еще раз. Довольно классический правый?

Но каков наилучший способ решить это решение? Я подумал об этом:

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 ввода вопросов подряд. Это означало бы 4 раза эту неприятную while() петлю.

Вы также можете написать функцию. Что-то вроде этого (нет причин, чтобы сделать это правильно, его просто для иллюстрации концепции):

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

Не совсем «умная идея», но правильный ответ. –

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 недействительно» в случае недопустимого ввода;) (Вам должна быть временная строковая переменная, насколько я могу видеть). –

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

Конечно, это не проверяет длину строки , но вы можете легко добавить к нему счет.После быстрого теста он немного быстрее (5%), чем TryParse. – Mark