由于数字也可以是小数,这让我认为信用卡号应该是整数。这是有道理的,因为我不认为任何一张信用卡以0开头,而且它们都遵循相同的模式:
4444333322221111
所以我猜它们是整数,但我不太确定国际卡是什么样子的?有没有以0开头的卡?
更新
感谢您所有人的回复。这不仅仅是为了存储它们(实际上我只会存储最后4个数字),还要进行快速验证检查。无论如何,我将把它视为整数进行验证,即确保其长度介于13-16位之间,并且始终不是小数。
由于数字也可以是小数,这让我认为信用卡号应该是整数。这是有道理的,因为我不认为任何一张信用卡以0开头,而且它们都遵循相同的模式:
4444333322221111
所以我猜它们是整数,但我不太确定国际卡是什么样子的?有没有以0开头的卡?
更新
感谢您所有人的回复。这不仅仅是为了存储它们(实际上我只会存储最后4个数字),还要进行快速验证检查。无论如何,我将把它视为整数进行验证,即确保其长度介于13-16位之间,并且始终不是小数。
信用卡号码并不是严格的数字。它们是字符串,但构成16位长数字的数字可以被分解以通过数字的校验和进行验证。
您不需要在信用卡号上执行任何乘法或除法,因此在我看来,它应该是一个字符串。
CARD TYPE | Prefix | Length | Check digit algorithm
-----------------------------------------------------------------
MASTERCARD | 51-55 | 16 | mod 10
VISA | 4 | 13, 16 | mod 10
AMEX | 34/37 | 15 | mod 10
Discover | 6011 | 16 | mod 10
enRoute | 2014/2149 | 15 | any
JCB | 3 | 16 | mod 10
JCB | 2131/1800 | 15 | mod 10
最好使用由单个数字 int
组成的数组。通常,各个数字会在某种校验和(checksum)中用于验证信用卡号码。这也能够解决信用卡号码以 0 开头的情况。
例如:
int[] cc = { 4, 3, 2, 1 }
bool Validate(int[] cc)
{
return ((cc[0] + 2*cc[1] + 6*cc[2]) % 5) == 0;
}
虽然使用的公式更加复杂,但类似于这样的。如果只用 <
和 >
进行计算,这将会更加困难(即需要执行除法和截断操作)。
int cc = 4321;
编辑:
请记住,信用卡号码中的每个数字都代表着某种含义。例如,第3和第4位数字可能代表该卡片制造的州,而第5位数字可能是发卡银行的索引,例如。
10^n
才能得到第n
位数字。字符串本质上是字符数组,也是一个可行的选择,但每次想要进行数学运算(如校验和)时都需要将char转换为int。 - user807566个人而言,我总是将它们存储为字符串... 它是一系列整数,就像电话号码一样,而不是一个大整数。
CreditCard
类,并提供访问卡号的接口,而不是要求每个客户端函数解析字符串。 - user807566我想它们应该是整数,因为它们(几乎肯定)不包含任何字母字符,也从来没有小数点。