2009-02-02 96 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

相關問題