2016-02-06 3 views
-3

Задача состоит в том, чтобы создать сегмент кода, где пользователь должен поместить свой почтовый индекс. Это должно быть «буква + номер + буква + пробел + номер + буква + номер». Она должна иметь 7 символов максимум и использовать «если» заявление для проверки и после ошибки, если пользователь не вводит правильный тип characters.For пример: A2B 1С3Как я могу убедиться, что пользователь вводит правильный символ в 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

Я не согласен, что вы должны использовать обычные выражения. Это можно легко решить с помощью простого и читаемого кода - не нужно более усложнять его.

Во-первых, как вы уже это сделали, вы можете легко получить длину строки. Если это допустимая длина, то это просто проверка того, что каждый символ в строке действителен. Вы можете использовать методы IsDigit и IsLetter от char, чтобы проверить, что любой символ в строке является числом или буквой. Вы могли бы написать такой метод, как:

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

Если вы хотите, чтобы посмотреть в решении этого через Regex, вы можете достичь того же эффекта через что-то вроде :

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

EDIT

Если ограничения из IsDigit и IsLetter не пригодны, ОП может также создать список допустимых символов себя и проверить против него:

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] == ' '; 
} 

Очевидно validLetters и validNumbers будет гораздо более уместно, построенной когда-члены класса , но я поставил их в рамках метода для удобства иллюстрации.

+0

Обратите внимание, что 'IsLetter' и 'IsDigit' используют свойства символа Юникода, которые могут быть не такими, какие вы хотите. Ваш кодовый блок эквивалентен регулярному выражению '^ \ p {L} \ d \ p {L} \ d \ p {L} \ d $'. Аскер, вероятно, хочет '^ \ [a-zA-Z] [0-9] [a-zA-Z] [0-9] [a-zA-Z] [0-9] $' –

+0

Справедливый комментарий - см. Мой для эквивалентного решения, если это так. – TVOHM

+0

Да, это должно сработать, хотя я бы сказал, что использование регулярного выражения было бы более простым и читаемым * теперь :) Если вы абсолютно хотите сделать это с помощью кода, было бы проще написать две вспомогательные функции, такие как 'static bool IsAsciiLetter (это char c) => 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z'; '- вы поняли суть. Или добавив условие, подобное 'postcode.All (c => c <128)' к вашему первому решению. –

Смежные вопросы