2016-02-06 80 views
-3

任務是創建用戶必須放置郵政編碼的一段代碼。它必須是「字母+數字+字母+空格+數字+字母+數字」。它需要有最多7個字符,並使用「如果」語句來驗證,如果用戶沒有輸入正確的類型characters.For例如發佈一個錯誤:A2B 1C3我如何確保用戶在C#中輸入正確的字符類型?

string postalCode; 
Console.WriteLine("Enter Your Postal Code"); 
postalCode = Console.ReadLine(); 

if (postalCode.Length == 7) 
{ 
    Console.WriteLine("Your Postal Code is " + postalCode); 
} 
else 
{ 
    Console.WriteLine("Error invalid Postal Code"); 
} 

Console.ReadKey(); 
+1

研究正則表達式。您可以創建一個匹配該序列的表達式,並根據該表達式測試輸入。 – David

+0

確切的問題是什麼? – Alejandro

+0

[C#驗證美國或加拿大郵政編碼]可能的重複(http://stackoverflow.com/questions/14942602/c-validation-for-us-or-canadian-zip-code) –

回答

2

我不同意,你應該使用常用表達。這可以使用簡單易讀的代碼輕鬆解決 - 無需過度複雜化。

首先,你已經完成了,你可以很容易地得到字符串的長度。如果它是一個有效的長度,那麼它只是檢查字符串中的每個字符是否有效的問題。您可以使用char中的IsDigitIsLetter方法檢查字符串中的任何給定字符是數字還是字母。你可以寫一個方法,如:

public bool IsValidPostcode(string postcode) 
{ 
    return postcode.Length == 7 
     && char.IsLetter(postcode[0]) 
     && char.IsLetter(postcode[2]) 
     && char.IsLetter(postcode[5]) 
     && char.IsDigit(postcode[1]) 
     && char.IsDigit(postcode[4]) 
     && char.IsDigit(postcode[6]) 
     && postcode[3] == ' '; 
} 

,並使用這個在您的例子,如:

if (IsValidPostcode(postalCode)) 
{ 
    Console.WriteLine("Your Postal Code is " + postalCode); 
} 
else 
{ 
    Console.WriteLine("Error invalid Postal Code"); 
} 

如果你想尋找到通過正則表達式解決這種情況,可以通過像達到同樣的效果:

bool validPostCode = Regex.Match(postalCode, @"^[a-zA-Z]\d[a-zA-Z] \d[a-zA-Z]\d$").Success; 

編輯

如果從ISDIGIT和IsLetter約束條件是不適合的,在OP也可以建立允許的字符列表自己和對證:

public static bool IsValidPostcode(string postcode) 
{ 
    char[] validLetters = Enumerable.Range('a', 'z' - 'a' + 1) 
     .Concat(Enumerable.Range('A', 'Z' - 'A' + 1)) 
     .Select(c => (char)c).ToArray(); 
    char[] validNumbers = Enumerable.Range('0', 10).Select(c => (char)c).ToArray(); 

    return postcode.Length == 7 
     && validLetters.Contains(postcode[0]) 
     && validLetters.Contains(postcode[2]) 
     && validLetters.Contains(postcode[5]) 
     && validNumbers.Contains(postcode[1]) 
     && validNumbers.Contains(postcode[4]) 
     && validNumbers.Contains(postcode[6]) 
     && postcode[3] == ' '; 
} 

顯然validLettersvalidNumbers會更適合作爲構建一次類成員,但爲了便於說明,我已將它們放在方法中。

+0

請注意'IsLetter'和'IsDigit'使用Unicode字符屬性,這可能不是你想要的。你的代碼塊相當於正則表達式'^ \ p {L} \ d \ p {L} \ d \ p {L} \ d $'。 Asker可能想要'^ \ [a-zA-Z] [0-9] [a-zA-Z] [0-9] [a-zA-Z] [0-9] $' –

+0

公平評論 - 如果是這種情況,請編輯相應的解決方案。 – TVOHM

+0

是的,這應該工作,雖然我認爲使用正則表達式會更多*簡單和可讀*現在:)如果你絕對想通過代碼來做到這一點,它會更容易編寫兩個輔助函數,比如'static bool IsAsciiLetter (this char c)=>'a'<= c && c <='z'|| 'A'<= c && c <='Z';' - 你明白了。或者通過在你的第一個解決方案中添加一個像'postcode.All(c => c <128)'這樣的條件。 –

相關問題