如果SSN号码正确则检查

时间:2015-11-11 16:09:55

标签: 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);
  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它也说“无效”)?

2 个答案:

答案 0 :(得分:2)

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

你的第二个破折号位于第6位,所以你应该改为substring(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");
}

答案 1 :(得分:0)

此处将代码更改为此只是一些小修改

我还提到了更改

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");
        }
    }
}

一切正常。

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

注意: 下面给出的代码使用https://stackoverflow.com/users/1501234/jaroslaw-pawlak给出的语法如果您使用下面给出的代码,请归功于原作者

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.matches("\\d{3}\\-\\d{2}\\-\\d{4}")) {
            System.out.println("The enter is valid");
        } else {
            System.out.println("The enter is invalid");
        }
    }
}