using System.Collections.Generic;
using System.Text.RegularExpressions;
public static void Main()
string pattern = @"^(?:[4,5,3,9][0-9]{3}(?:.{0,1})[0-9]{4}(?:.{0,1})[0-9]{4}(?:.{0,1})[0-9]{4})";
string[] creditabc = {"4221-0930-8100-1828","4221093081001828","4221 0930 8100 1828","4221|0930|8100|1828","4221_0930_8100_1828","4221.0930.8100.1828","4221gh0930dfgsd8100dfl1828"};
Regex r = new Regex(pattern);
foreach(string s in creditabc)
Console.WriteLine("Final:" + Mod10Check(s));
Console.WriteLine("CreditCard: {0} a valid ", s);
Console.WriteLine("CreditCard: {0} a not valid ", s);
public static bool Luhn(string digits)
Console.WriteLine("STT: " + ii.ToString());
Console.WriteLine("Befor: " + digits);
var abc = digits.Reverse();
Console.Write("After 1: ");
foreach (var number in abc)
Console.Write(number.ToString() + "");
var abc1 = digits.Reverse().Select(c => c - 48);
Console.Write("After 2: ");
foreach (var number in abc1)
Console.Write(number.ToString() + "");
return digits.All(char.IsDigit) && digits.Reverse().Where((e) => e >= '0' && e <= '9')
.Select((e, i) => ((int)e - 48) * (i % 2 == 0 ? 1 : 2))
.Sum((e) => e / 10 + e % 10) % 10 == 0;
public static bool Mod10Check(string creditCardNumber)
Console.WriteLine("[DEBUG] Befor: " + creditCardNumber);
if (string.IsNullOrEmpty(creditCardNumber))
var sumOfDigits = creditCardNumber.Select((e, i) => ((int)e-48));
Console.Write("[DEBUG] After 1 (input): ");
foreach (var number in sumOfDigits)
Console.Write(number.ToString() + "");
var sumOfDigits4 = creditCardNumber.Reverse().Select((e, i) => ((int)e - 48) * (i % 2 == 0 ? 1 : 2));
Console.Write("[DEBUG] After 2 (To hop): ");
foreach (var number in sumOfDigits4)
Console.Write(number.ToString() + "|");
Console.Write("[DEBUG] After 3 (khong Reverse): ");
var sumOfDigits5 = creditCardNumber.Select((e, i) => ((int)e - 48) * (i % 2 == 0 ? 1 : 2)).Sum((e) => e / 10 + e % 10);
Console.Write(sumOfDigits5);
var sumOfDigits2 = creditCardNumber.Reverse().Select((e, i) => ((int)e - 48) * (i % 2 == 0 ? 1 : 2)).Sum((e) => e / 10 + e % 10);
int sumOfDigits1 = creditCardNumber.Where((e) => e >= '0' && e <= '9')
.Select((e, i) => ((int)e - 48) * (i % 2 == 0 ? 1 : 2))
.Sum((e) => e / 10 + e % 10);
Console.Write("[DEBUG]" + sumOfDigits1 + "|" + sumOfDigits2);
return sumOfDigits1 % 10 == 0;