2015-10-05 3 views
2

Это для задания. Мне нужно создать программу для сэндвич-магазина. Частью этого является проверка информации о платеже пользователя. Руководящие принципы для этого задания:C# Подтверждение ввода пользователя как номер кредитной карты

Номер кредитной карты должен быть 16 цифр; первые 4 цифры должны быть следующими: 1298, 1267, 4512, 4567, 8901, 8933

Срок годности должен быть 2 цифры за месяц, 4 цифры за год. Месяц должен быть 01-12. Год должен начинаться с «20». Дата должна быть больше текущего текущего месяца и года и менее 6 лет от текущего фактического месяца и года.

У меня есть текстовое поле для каждого номера, txtCardNumber, txtSecuritycode и txtExpiration. У меня есть работы, но я думаю, что это беспорядочно. Что было бы лучше? И можно ли использовать только один метод Validate() вместо отдельного для каждого?

public bool IsValidCard() 
{ 
    if (txtCardNumber.Text.StartsWith("1298") || 
     txtCardNumber.Text.StartsWith("1267") || 
     txtCardNumber.Text.StartsWith("4512") || 
     txtCardNumber.Text.StartsWith("4567") || 
     txtCardNumber.Text.StartsWith("8901") || 
     txtCardNumber.Text.StartsWith("8933")) 
    { 
     if (Regex.Replace(txtCardNumber.Text, @"\s+", "").Length == 16) 
     { 
      return true; 
     } 
    } 
    return false; 
}//end IsValidCard() 

public bool IsValidSecurityCode() 
{ 
    bool isValid = Regex.Match(txtSecurityCode.Text, @"^\d{3}$").Success; 
    return isValid; 
}//end IsValidSecurityCode() 

public bool IsValidExpiration() 
{ 
    string[] date = Regex.Split(txtExpiration.Text, "/"); 
    string[] currentDate = Regex.Split(DateTime.Now.ToString("MM/yyyy"), "/"); 
    int compareYears = string.Compare(date[1], currentDate[1]); 
    int compareMonths = string.Compare(date[0], currentDate[0]); 

    //if expiration date is in MM/YYYY format 
    if (Regex.Match(txtExpiration.Text, @"^\d{2}/\d{4}$").Success) 
    { 
     //if month is "01-12" and year starts with "20" 
     if (Regex.Match(date[0], @"^[0][1-9]|[1][0-2]$").Success) 
     { 
      //if expiration date is after current date 
      if ((compareYears == 1) || (compareYears == 0 && (compareMonths == 1))) 
      { 
       return true; 
      } 
     } 
    } 
    return false; 
}//end IsValidExpiration 

Примечание: Я не работал над утверждением шестилетнего требования.

+2

не забывайте контрольную сумму https://en.wikipedia.org/wiki/Luhn_algorithm – WalterM

+1

Вы можете использовать '^ (1298 | 1267 | 4512 | 4567 | 8901 | 8933) ([\ - \ s]? [ 0-9] {4}) {3} $ 'для номера кредитной карты,'^(0 [1-9] {1} | 1 [0-2] {1}) $ 'за месяц и'^20 [ 0-9] {2} $ 'за год. Как только они будут проверены, вам необходимо проверить состояние 6 лет, которое зависит от текущей даты и не может быть выполнено с помощью 'Regex'. –

+0

@WalterM, алгоритм Луна довольно милый, но, вероятно, переборщик для моих целей. –

ответ

3

Вы можете использовать следующий метод, который будет проверять всю информацию о кредитной карте в соответствии с вашими требованиями.

< 1> Номер кредитной карты должен быть 16 цифр; первые 4 цифры должны быть один из них: 1298, 1267, 4512, 4567, 8901, 8933

< 2> Код безопасности должен быть 3 значный цифровой (предположительно)

< 3> Срок годности должен быть 2 цифры за месяц, < 4> 4 цифры за год. < 5> Месяц должен быть 01 - 12. < 6> Год должен начинаться с «20». < 7> Дата должна быть больше, чем текущий фактический месяц и год, и < 8> менее 6 лет от текущего фактического месяца и года.

public static bool IsCreditCardInfoValid(string cardNo, string expiryDate, string cvv) 
{ 
    var cardCheck = new Regex(@"^(1298|1267|4512|4567|8901|8933)([\-\s]?[0-9]{4}){3}$"); 
    var monthCheck = new Regex(@"^(0[1-9]|1[0-2])$"); 
    var yearCheck = new Regex(@"^20[0-9]{2}$"); 
    var cvvCheck = new Regex(@"^\d{3}$"); 

    if (!cardCheck.IsMatch(cardNo)) // <1>check card number is valid 
     return false; 
    if (!cvvCheck.IsMatch(cvv)) // <2>check cvv is valid as "999" 
     return false; 

    var dateParts = expiryDate.Split('/'); //expiry date in from MM/yyyy    
    if (!monthCheck.IsMatch(dateParts[0]) || !yearCheck.IsMatch(dateParts[1])) // <3 - 6> 
     return false; //^check date format is valid as "MM/yyyy" 

    var year = int.Parse(dateParts[1]); 
    var month = int.Parse(dateParts[0]);    
    var lastDateOfExpiryMonth = DateTime.DaysInMonth(year, month); //get actual expiry date 
    var cardExpiry = new DateTime(year, month, lastDateOfExpiryMonth, 23, 59, 59); 

    //check expiry greater than today & within next 6 years <7, 8>> 
    return (cardExpiry > DateTime.Now && cardExpiry < DateTime.Now.AddYears(6)); 
} 

Хотя это прекрасно работает для всех условий, пожалуйста, проверьте правильно перед использованием в производстве.

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