簡體   English   中英

驗證C#中的readline輸入的最佳方法?

[英]Best way to verify readline input in C#?

哦,有兩件事:1)它是一個控制台應用程序。 2)我知道這是丹麥語,但這並不重要,它只是要求輸入一些內容的示例。 文本和變量無關緊要。

好吧,考慮一下這個簡單的輸入:真的可能是任何形式的輸入問題。

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()解決方案更好。

有人有聰明的主意嗎?

使用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.");
    }
}

您可以使用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...");
}

只是出於某種變化,如何測試字符串本身而不是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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM