信用卡号码是数字还是整数?

问题描述 投票:8回答:6

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

4444333322221111

所以我猜他们是一个整数,但我不太清楚国际卡是什么样的?有以0开头的吗?

更新

谢谢大家的回复。存储它们的意义不大(其实我只会存储最后4个数字),更多的是做一个快速的验证检查。无论如何,我都会把它当作一个整数来进行验证,即确保它的长度在13-16位之间,而且永远不会是小数。

numbers integer credit-card
6个回答
32
投票

信用卡号码是 非严格意义上的数字. 它们是 字符串但组成长16位数字的数字可以被分解,以便通过使用数字的校验和来验证该数字。

你不会对CC号做任何乘法或除法,所以在我看来,它应该是一个字符串。

快速前缀、长度和校验码标准

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

4
投票

不要使用整数。

根据你的整数的大小(取决于语言机器),它们可能太大了,不能作为整数存储。

使用信用卡号码也不要作为整数,因为没有理由用它们做算术。

一般来说,你应该把它们看作是十进制数字的数组,这可能最容易被存储为字符串,但可能值得一个实际的数组,这同样取决于你的编程语言。

它们还包含编码的银行当局信息,如在 维基百科上关于银行卡号的文章的特殊情况,并且是 ISOIEC 7812 数字,事实上,它可以从零开始(虽然我不认为任何信用卡都是如此)。 如果你需要这些信息,一个CC号实际上可能值得它自己的数据类型,而且很可能一些银行实现了一个。


3
投票

最好使用一个单数位的数组 ints. 通常情况下,各个数字会被用于某种类型的校验,以验证信用卡号码。 它也可以处理CC#实际以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位数字可能是发卡的特定银行的索引,例如。


2
投票

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


0
投票

我认为它们是整数,因为它们(几乎可以肯定)不包含任何字母字符,也没有任何小数点。


0
投票

没有一个信用卡号码是以0开头的(可能是由于这样的讨论)。

所有的信用卡号码都有一个校验码,校验码的计算方法是使用 卢恩算法

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

© www.soinside.com 2019 - 2024. All rights reserved.