.NET 4.5包含一个名为CreditCardAttribute
的新验证属性,该属性指定数据字段值是信用卡号。当我反编译包含此类的程序集时,我可以看到以下代码用于信用卡号验证:
public override bool IsValid(object value)
{
if (value == null)
{
return true;
}
string text = value as string;
if (text == null)
{
return false;
}
text = text.Replace("-", "");
text = text.Replace(" ", "");
int num = 0;
bool flag = false;
foreach (char current in text.Reverse<char>())
{
if (current < '0' || current > '9')
{
return false;
}
int i = (int)((current - '0') * (flag ? '\u0002' : '\u0001'));
flag = !flag;
while (i > 0)
{
num += i % 10;
i /= 10;
}
}
return num % 10 == 0;
}
有谁知道这里应用了哪种算法来验证数字格式? Luhn的算法?另外,这是ISO标准吗?最后,你认为这是正确的,100%正确的实施吗?
MSDN没有提供有关此内容的更多信息。事实上,他们有错误的信息如下:
说明
使用正则表达式验证该值。班级没有 验证信用卡号码是否仅对购买有效 它形成得很好。
答案 0 :(得分:5)
答案 1 :(得分:2)
这个算法实际上是Luhn的算法。不幸的是,并非所有卡号都可以通过此算法验证,因此它不是100%方法。但是,允许键入的卡号输入的万事达卡和维萨卡产品的卡号应通过此检查。
验证卡号是否存在的唯一100%方法是执行交易。通常用于PoS连接的收集器主机系统协议具有验证卡是否不在停止列表中并存在于路由表中的规定。