2017-04-06 66 views
0

所以,我正在做一個學校比薩計劃,要求客戶的詳細信息,如姓名電話號碼和地址。我想讓客戶在填寫地址時必須有號碼,空格和字母,我已經創建了一個應該出錯並告訴客戶他們的地址是無效的方法,但是這種方法似乎並沒有工作得很好。請幫助地址創建功能c#

這裏是代碼我目前的方法:

public static string ReadAddress(String prompt) // YOU DIDN'T SPELL THIS CORRECTLY 
    { 
     string userInput = " "; 
     bool success = false; 
     while (!success) 
     { 
      Console.Write(prompt); 
      try 
      { 
       userInput = Console.ReadLine(); 
       if (userInput.Length <= 70 && userInput.Length > 8) //checks the length of the user input 
       { 

        success = true;  //Assumes input is correct 
        bool letter = false; 
        bool space = false; 
        bool number = false; 

        foreach (char character in userInput) 
        { 
         letter = Char.IsLetter(character); 
         space = Char.IsWhiteSpace(character); 
         number = Char.IsNumber(character); 


        } 
        success = letter & space & number; 
       } 
       else 
       { 
        success = false; // enables loop to exit 

       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
     } 
     return userInput; 
    } 

目前這一切塊,即使我有一個數字,空格和字母。

+0

您覆蓋在字符循環的中間結果...這樣,你只會發現最後字符的字母空間和數字... – DarkSquirrel42

+0

@PaulF - 它不是按位。這不是[tag:c]。這是非短路布爾'和'。 –

+0

您的代碼似乎會以任意順序接受數字,空格和字母 - 如果您需要按照特定順序進行操作,那麼您需要更復雜的檢查。首先只用於號碼,然後檢查空間並只檢查信件。 – PaulF

回答

4

如果你已經有曾見過看過一封信,你想記住這個事實(對於其他字符類型同上)。

letter = letter || Char.IsLetter(character); 

(另外,我知道這個檢查會得罪一些人沒有結束,因爲他們生活在一個命名爲房子,沒有數字)

+0

它是如何工作的?字母=字母?你能解釋一下嗎? – Jay

+0

什麼時候'信'是'真'?它應該是'true' *如果它當前爲真*或者當前字符匹配'IsLetter(字符)'。 –

+0

所以基本上是字母=字母 – Jay

0

你的代碼更改爲類似的東西:

foreach (char character in userInput) 
{ 
    letter |= Char.IsLetter(character); 
    space |= Char.IsWhiteSpace(character); 
    number |= Char.IsNumber(character); 
} 

這樣你就不會在每個字符上覆蓋這些標誌。目前,唯一可行的方法是將最後一個字符同時標識爲字母,空白和數字(不可能的afaik)。 你可以在這裏瞭解更多關於這個運營商:https://msdn.microsoft.com/en-us/library/h5f1zzaw.aspx

0

其實你只檢查for聲明最後你的字符!您必須在for聲明的身體改成這樣:

foreach (char character in userInput) 
{ 
    letter = letter || Char.IsLetter(character); 
    space = space || Char.IsWhiteSpace(character); 
    number = number || Char.IsNumber(character); 
} 
2

你可以走了一步,而不是檢查每一個字符,使用正則表達式來檢查輸入的字符串的模式。

所以要檢查一個數字,後面加一個空格,然後一個字母:

success = Regex.IsMatch(userInput, "\d [A-Z]", RegexOptions.IgnoreCase); //'IgnoreCase' means that [A-Z] matches uppercase and lowercase. 

但這隻能對單個數字和單個字母相匹配。你可以稍微修改模式匹配整個地址:

success = Regex.IsMatch(userInput, "\d+([A-Z]+)+", RegexOptions.IgnoreCase); 

而對於情況下,你的房子可能會在像3rd Avenue

success = Regex.IsMatch(userInput, "\d+(\w+)+"); 
//Don't need to ignore case anymore, since \w is a word boundary and matches any letter, and numbers. 
+0

Upvoted雖然應該是相反的方式 - 數字空間的信。我猜測OP需要多個字母和數字,因爲最小輸入長度是9。 – PaulF