信用卡/借记卡号码是数字还是整数?

12

由于数字也可以是小数,这让我认为信用卡号应该是整数。这是有道理的,因为我不认为任何一张信用卡以0开头,而且它们都遵循相同的模式:

4444333322221111

所以我猜它们是整数,但我不太确定国际卡是什么样子的?有没有以0开头的卡?

更新

感谢您所有人的回复。这不仅仅是为了存储它们(实际上我只会存储最后4个数字),还要进行快速验证检查。无论如何,我将把它视为整数进行验证,即确保其长度介于13-16位之间,并且始终不是小数。


3
如果你正在处理信用卡号码,为什么不在处理时查看你所使用的API并使用该数据格式? - Sign
6个回答

40

信用卡号码并不是严格的数字。它们是字符串,但构成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

3
7年后,这张桌子仍然给人留下深刻的印象。 - VTodorov
这个答案虽然有点老,但我想指出的是,如果你在 SQL Server 中将卡号存储为 varchar 而不是 decimal,那么存储差异会非常大。一个 varchar(16) 将占用 16 字节的存储空间,而 decimal(16,0) 则只需要 9 字节。显然,对于小数据集来说,这并不是什么大问题,但对于数千万张卡片号码来说,存储差异是非常显著的。 - user2966445
九年后。想要查看一张卡是否适合某个范围。将其存储为数字可以进行大于或小于的比较。 - Wes

4
不要使用整数来处理这个。
根据您的整数大小(与语言/机器有关),它们可能太大而无法存储为整数。
信用卡号码的使用也不是作为整数,因为没有理由对它们进行算术运算。
您应该将它们视为十进制数字数组,最容易以字符串形式存储,但可能根据您的编程语言需要实际数组。
它们还包含编码银行授权信息,如维基百科上的银行卡号文章所述,并且是ISO/IEC 7812号码的特殊情况,实际上可以以零开头(尽管我认为没有任何信用卡这样做)如果您需要此信息,则CC号码可能实际上值得拥有自己的数据类型,很可能一些银行实现了这种类型。

3

最好使用由单个数字 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位数字可能是发卡银行的索引,例如。


你能举个例子说明这在哪些情况下是必要的吗? - Thilo
@Thilo:所有类型的校验和验证。谷歌上有很多相关内容。 - Niklas B.
所有这些都可以使用整数或字符串实现。 - Thilo
1
@Thilo:没错。然而,整数无法存储前导0,并且需要除以10^n才能得到第n位数字。字符串本质上是字符数组,也是一个可行的选择,但每次想要进行数学运算(如校验和)时都需要将char转换为int。 - user807566

2

个人而言,我总是将它们存储为字符串... 它是一系列整数,就像电话号码一样,而不是一个大整数。


1
一系列整数不是更适合用整数数组来表示吗?(或者可能作为字符数组,但不是 ASCII 字符串的意义上) - Niklas B.
1
从技术上讲,是的,但在我看来这似乎有点过头了...这取决于你是想让系统达到100%的性能还是更加开发人员友好。 - tommy5dollar
1
在验证信用卡号码时,通常需要使用实际的整数值。因此,我发现将它们直接存储为整数比在每次操作之前将数字转换为整数更方便。但这更多是品味问题。 - Niklas B.
1
@tommy5dollar:最适合开发者的应用程序是拥有一个CreditCard类,并提供访问卡号的接口,而不是要求每个客户端函数解析字符串。 - user807566

1

我想它们应该是整数,因为它们(几乎肯定)不包含任何字母字符,也从来没有小数点。


0

没有信用卡/借记卡号码以零开头(可能是由于像这样的讨论)。

所有信用卡/借记卡号码都有一个检查数字,该数字使用Luhn算法计算。

恰好,4444333322221111通过了Luhn检查数字测试。


我再也找不到来源了,但我曾经查过一些资料,发现某些信用卡号码可以以0开头。 - Timo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接