Java:如何使用Luhn check和using方法检查信用卡的有效性
我一直在试图找出Luhns验证信用卡的方法,但我似乎无法找到它。我需要使用方法,不能使用数组,所以我完全被难住了 这是卢恩的支票: 信用卡号必须在13到16位之间。它必须从以下方面开始: ■ 4.Visa卡 ■ 5张万事达卡 ■ 37张美国运通卡 ■ 6用于发现卡Java:如何使用Luhn check和using方法检查信用卡的有效性,java,methods,luhn,Java,Methods,Luhn,我一直在试图找出Luhns验证信用卡的方法,但我似乎无法找到它。我需要使用方法,不能使用数组,所以我完全被难住了 这是卢恩的支票: 信用卡号必须在13到16位之间。它必须从以下方面开始: ■ 4.Visa卡 ■ 5张万事达卡 ■ 37张美国运通卡 ■ 6用于发现卡 从右到左每隔两位数。如果将一个数字加倍得到一个两位数的数字,则将两位数相加得到一个一位数的数字 现在将步骤a中的所有单个数字相加 在卡号中从右到左的奇数处添加所有数字 将步骤b和步骤c的结果相加 如果步骤d的结果可被10整除,则卡号有
public static boolean isValid(String x) {
return false; // Stub method
}
public static void AddResults() {
}
public static void OddDigits(String s) {
int sum = 0;
for (int index = 0; index < s.length(); index ++) {
if (index % 2 != 0) {
sum = sum + Character.getNumericValue(s.charAt(index));
}
}
return;
}
public static int DoubleToSingle(int x) { // Adds up the digits in a two-digit number.
if (x < 10) {
return x;
}
else {
int firstDigit = x % 10;
int secondDigit = (int)(x / 10);
return firstDigit + secondDigit;
}
}
public static void Doubling(String s) {
int sum = 0;
for (int index = s.length() - 1; index > 0; index-= 2) {
int parse = Character.getNumericValue(s.charAt(index));
if (parse > 9) {
sum = sum + DoubleToSingle(parse);
}
else {
sum = sum + parse;
}
}
return;
}
public static boolean CheckLength(String s) {
if (s.length() < 13 || s.length() > 16) { // If the cc number is smaller than 13 digits or larger than 16 digits, it's invalid
return false;
}
else {
return true;
}
}
public static String ReadString(Scanner s) { // Creating a string method. (Using it to practice creating methods)
String x = s.nextLine();
return x;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Please input a valid Credit Card number: ");
String CC = ReadString(input);
if (isValid(CC) == true) {
System.out.println(CC + " is valid.");
} else {
System.out.println(CC + " is invalid.");
}
input.close();
}
公共静态布尔值有效(字符串x){
返回false;//存根方法
}
公共静态void AddResults(){
}
公共静态无效数字(字符串s){
整数和=0;
对于(int index=0;index0;index-=2){
int parse=Character.getNumericValue(s.charAt(index));
如果(解析>9){
sum=sum+DoubleToSingle(解析);
}
否则{
sum=sum+parse;
}
}
回来
}
公共静态布尔校验长度(字符串s){
如果(s.length()<13 | | s.length()>16){//如果cc数小于13位或大于16位,则它无效
返回false;
}
否则{
返回true;
}
}
publicstaticstringreadstring(scanners){//创建一个String方法。(使用它来练习创建方法)
字符串x=s.nextLine();
返回x;
}
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(System.in);
System.out.println(“请输入有效的信用卡号:”);
字符串CC=读取字符串(输入);
如果(isValid(CC)=真){
System.out.println(CC+“有效”);
}否则{
System.out.println(CC+“无效”);
}
input.close();
}
关于您的代码的评论:
- Java命名约定是方法名以小写字母开头,就像您的
方法一样isValid
- 在
方法中,doubleToSingle
是一个x
,int
是一个10
文本,因此int
将是一个x/10
,结果将被截断,这意味着不需要进行此转换:int
(int)(x/10)
- 由于
方法可以处理一位数,因此调用方(double-tosingle
方法)也不需要处理它,因此消除double
测试if(parse>9)
- 从右侧开始计算数字的工作原理如下:
5位奇数位: ↓ 第三位数不要把这些数字翻两倍,只要把它们加起来就行了 ↓ ↓ 第一位 ↓ ↓ ↓ 999999 ↑ ↑ ↑ ↑ ↑ 第二位偶数位,也称为“右起每第二位”: ↑ 第四位是这些数字的两倍,在 第六位两位数,然后求和
方法从最后一个索引开始,而不是应该从第二个索引开始,它跳过了不应该从第一个索引开始的索引。循环应为:doubling
for (int index = s.length() - 2; index >= 0; index -= 2)
- 在调用
方法之前,doubleToSingle
方法确实需要将数字加倍(doubleToSingle
)parse*2
方法从左侧计数奇数/偶数,而它应该从右侧计数 删除odddights
测试,并使用与if(索引%2!=0)
方法类似的循环:double
for (int index = s.length() - 1; index >= 0; index -= 2)
和double
方法应该odddights
返回
,否则有什么意义和
double
和odddights
方法缺少返回值是您陷入困境的原因,那么我将让您从这里开始处理其余代码
虽然下面的代码超出了您当前的技能水平,但我想展示它,让您有一些期待,能够理解并最终编写类似的代码
public static boolean isValid(String cc) {
if (! cc.matches("(?=[456]|37)[0-9]{13,16}"))
return false;
int sum = 0;
for (int i = cc.length() - 1, pos = 1; i >= 0; i--, pos++) {
int digit = cc.charAt(i) - '0';
sum += (pos % 2 == 1/*odd*/ ? digit : digit < 5 ? digit * 2 : digit * 2 - 9);
}
return (sum % 10 == 0);
}
公共静态布尔值有效(字符串cc){
如果(!cc.matches((?=[456]| 37)[0-9]{13,16}”))
返回false;
整数和=0;
对于(int i=cc.length()-1,pos=1;i>=0;i--,pos++){
整数位数=抄送字符(i)-“0”;
总和+=(位置%2==1/*奇数*/?位数:位数<5?位数*2:位数*2-9);
}
返回(总和%10==0);
}
它测试问题中列出的所有条件,甚至是您尚未开始的“必须从”部分。在您的技能水平上,您可能应该使用s.startsWith(“xx”)
而不是此处使用的匹配(…)
正则表达式