Java 检查SSN编号是否正确

Java 检查SSN编号是否正确,java,Java,我搜索了这个问题,从“大麋鹿沙龙”网站上得到了答案,这与我写的略有不同。网站程序如下: if (social.length() == 11) { valid = true; // Check that the characters are valid // Valid as digits char index0 = social.charAt(0); char index1 = social.charAt(1); char index2 = social.charAt(2

我搜索了这个问题,从“大麋鹿沙龙”网站上得到了答案,这与我写的略有不同。网站程序如下:

if (social.length() == 11) {
  valid = true;
  // Check that the characters are valid
  // Valid as digits
  char index0 = social.charAt(0);
  char index1 = social.charAt(1);
  char index2 = social.charAt(2);
  char index4 = social.charAt(4);
  char index5 = social.charAt(5);
  char index7 = social.charAt(7);
  char index8 = social.charAt(8);
  char index9 = social.charAt(9);
  char index10 = social.charAt(10);
  // Valid as hyphen
  char index3 = social.charAt(3);
  char index6 = social.charAt(6);

  if (Character.isDigit(index0) && Character.isDigit(index1)
        && Character.isDigit(index2) && Character.isDigit(index4)
        && Character.isDigit(index5) && Character.isDigit(index7)
        && Character.isDigit(index8) && Character.isDigit(index9)
        && Character.isDigit(index10) && index3 == '-'
        && index6 == '-') {
     valid = true;
   }
} else
   valid = false;
return valid;
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
System.out.println("Enter your Social security number as DDD-DD-
    DDDD");
String str = input.nextLine();

if (str.length()==11) {
    System.out.println("Invalid input");

    if(Character.isDigit(str.charAt(0))&&Character.isDigit(str.charAt(1))
     &&Character.isDigit(str.charAt(2))&&Character.isDigit(str.charAt(4))
     &&Character.isDigit(str.charAt(5))&&Character.isDigit(str.charAt(7))
     &&Character.isDigit(str.charAt(8))&&Character.isDigit(str.charAt(9))
     &&Character.isDigit(str.charAt(10))
     &&((str.substring(3,6)).startsWith("-")&&   
      ((str.substring(3,6)).endsWith("-"))) {

     System.out.println("The enter is valid");
    }
  }
  else {
    System.out.println("The enter is invalid");
  }
 }
}
矿山是这样的:

if (social.length() == 11) {
  valid = true;
  // Check that the characters are valid
  // Valid as digits
  char index0 = social.charAt(0);
  char index1 = social.charAt(1);
  char index2 = social.charAt(2);
  char index4 = social.charAt(4);
  char index5 = social.charAt(5);
  char index7 = social.charAt(7);
  char index8 = social.charAt(8);
  char index9 = social.charAt(9);
  char index10 = social.charAt(10);
  // Valid as hyphen
  char index3 = social.charAt(3);
  char index6 = social.charAt(6);

  if (Character.isDigit(index0) && Character.isDigit(index1)
        && Character.isDigit(index2) && Character.isDigit(index4)
        && Character.isDigit(index5) && Character.isDigit(index7)
        && Character.isDigit(index8) && Character.isDigit(index9)
        && Character.isDigit(index10) && index3 == '-'
        && index6 == '-') {
     valid = true;
   }
} else
   valid = false;
return valid;
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
System.out.println("Enter your Social security number as DDD-DD-
    DDDD");
String str = input.nextLine();

if (str.length()==11) {
    System.out.println("Invalid input");

    if(Character.isDigit(str.charAt(0))&&Character.isDigit(str.charAt(1))
     &&Character.isDigit(str.charAt(2))&&Character.isDigit(str.charAt(4))
     &&Character.isDigit(str.charAt(5))&&Character.isDigit(str.charAt(7))
     &&Character.isDigit(str.charAt(8))&&Character.isDigit(str.charAt(9))
     &&Character.isDigit(str.charAt(10))
     &&((str.substring(3,6)).startsWith("-")&&   
      ((str.substring(3,6)).endsWith("-"))) {

     System.out.println("The enter is valid");
    }
  }
  else {
    System.out.println("The enter is invalid");
  }
 }
}
我想知道为什么我的程序出错(即使我输入123-45-6789,它也会显示“无效”)?

str.substring(3,6)。endsWith(“-”)
表示从字符3到字符6的子字符串。原始字符串中的第一个字符是字符0

您的第二个破折号位于位置6,因此您应该改为执行
子字符串(3,7)

更好的解决方案是使用
String#charAt(int)
检查这两个字符。就像你在“大麋鹿沙龙”上找到的解决方案一样

理想的解决方案是使用正则表达式。它将允许您将多行非常难以阅读的代码转换为单个表达式:

if (str.matches("\\d{3}\\-\\d{2}\\-\\d{4}")) {
    System.out.println("The enter is valid");
} else {
    System.out.println("The enter is invalid");
}

此处将代码更改为此仅做一些小更改

import java.util.Scanner;

public class SSN {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        System.out.println("Enter your Social security number as DDD-DD-DDDD");
        String str = input.nextLine();

        if (str.length() != 11) {//use != in place of ==
            System.out.println("Invalid input");
        } else if (Character.isDigit(str.charAt(0)) && Character.isDigit(str.charAt(1))
                && Character.isDigit(str.charAt(2)) && Character.isDigit(str.charAt(4))
                && Character.isDigit(str.charAt(5)) && Character.isDigit(str.charAt(7))
                && Character.isDigit(str.charAt(8)) && Character.isDigit(str.charAt(9))
                && Character.isDigit(str.charAt(10))
                && (str.charAt(3) == '-') && (str.charAt(6) == '-')) {//use charAt()
            System.out.println("The enter is valid");
        } else {
            System.out.println("The enter is invalid");
        }
    }
}
我也提到了这些变化

import java.util.Scanner;

public class SSN {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        System.out.println("Enter your Social security number as DDD-DD-DDDD");
        String str = input.nextLine();

        if (str.length() != 11) {//use != in place of ==
            System.out.println("Invalid input");
        } else if (Character.isDigit(str.charAt(0)) && Character.isDigit(str.charAt(1))
                && Character.isDigit(str.charAt(2)) && Character.isDigit(str.charAt(4))
                && Character.isDigit(str.charAt(5)) && Character.isDigit(str.charAt(7))
                && Character.isDigit(str.charAt(8)) && Character.isDigit(str.charAt(9))
                && Character.isDigit(str.charAt(10))
                && (str.charAt(3) == '-') && (str.charAt(6) == '-')) {//use charAt()
            System.out.println("The enter is valid");
        } else {
            System.out.println("The enter is invalid");
        }
    }
}

它会很好用。

但是如果你想要最短的代码,那么就使用正则表达式

注意:下面给出的代码使用了的语法,如果您使用下面给出的代码,请相信原始作者


第一个也不起作用:它将为任何11个字符的字符串返回true,例如“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa?因为我试过aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{,
valid
被设置为true,以后再也不会返回false。@AndyTurner是的,我认为你是对的。@pawlak非常感谢!原来我犯了这么一个简单的错误。我按照你说的更改了我的程序,它运行得很好。我还没有学习正则表达式,但感谢你给我展示了这个理想的解决方案!谢谢你告诉我那!我确实发现,如果我输入12-345-6789,它既不会给我有效的指令,也不会给我无效的指令。似乎我的程序有错误。我把它改成了你的想法,现在一切似乎都好了。比你好!很好。你把@pawlak给出的答案标记为已接受,这是一件好事。必须对原始作者给予适当的信任。