我认为找出答案最好的方法就是进行简单测试:
using System;
using System.Linq;
using System.Text;
using System.IO;
namespace SO
{
class Program
{
static void Main(string[] args)
{
string[] cards = new string[] {
"378282246310005",
"4012888888881881",
"6011111111111117",
"4222222222222",
"76009244561",
"5019717010103742",
"6331101999990016",
"30569309025904",
"5147004213414803",
"6011491706918120",
"379616680189541",
"4916111026621797",
};
foreach (string card in cards)
{
Console.WriteLine(IsValid(card));
}
Console.ReadLine();
}
public static bool IsValid(object value)
{
if (value == null)
{
return true;
}
string ccValue = value as string;
if (ccValue == null)
{
return false;
}
ccValue = ccValue.Replace("-", "");
ccValue = ccValue.Replace(" ", "");
int checksum = 0;
bool evenDigit = false;
foreach (char digit in ccValue.Reverse())
{
if (digit < '0' || digit > '9')
{
return false;
}
int digitValue = (digit - '0') * (evenDigit ? 2 : 1);
evenDigit = !evenDigit;
while (digitValue > 0)
{
checksum += digitValue % 10;
digitValue /= 10;
}
}
return (checksum % 10) == 0;
}
}
}
IsValid方法来自于原始的C#CreditCardAttribute类。
12个数字中有1个失败:
True
True
True
True
False //"76009244561", // Dankort (PBS)
True
True
True
True
True
True
True
所以,您应该使用它吗?不,显然它不能检测所有数字。尽管您可以采用他们的代码并进行改进!
CreditCardAttribute
如何验证输入的见解。 - Tom