使用字符串进行SSN验证

时间:2015-04-30 03:17:03

标签: java string validation io boolean-expression

我应该编写一个程序,将SSN作为字符串读入,包括破折号,如DDD-DD-DDDD,其中“D”是一个数字。如果它有效,则打印“有效ssn”,如果无效则打印相反。我应该有四个方法:main,public static boolean validSSN(String s),public boolean isDigit(char c),public boolean isDash(char c)。应该在方法public static boolean validSSN(String s)中调用最后两个。我们目前正在进行字符串和文本I / O.我知道如何使用java.io.File读取字符串,但除此之外,我不知所措。以下是我到目前为止的情况:

import java.io.File;
import java.util.Scanner;

public class Lab14 {
public static void main(String[] args)throws Exception {
    File file = new File("C:\\Documents and     Settings\\Russell\\Desktop\\Social-Security-Numbers.txt");
    Scanner input = new Scanner(file);
        String case1 = input.nextLine();
        String case2 = input.nextLine();
        String case3 = input.nextLine();
        String case4 = input.nextLine();
    input.close();
    System.out.println("The first case is: " + case1 + ". This is a " + validSSN(case1) + " entry.");
    System.out.println("The second case is: " + case2 + ". This is a " + validSSN(case2) + " entry.");
    System.out.println("The third case is: " + case3 + ". This is a " + validSSN(case3) + " entry.");
    System.out.println("The fourth case is: " + case4 + ". This is a " + validSSN(case4) + " entry.");
}
public static boolean validSSN(String s){
    if (s.length() == 11){
        if((isDash(s.charAt(3))==true) && isDash(s.charAt(6))==true){
            for(int i = 0; i < s.length(); i++){
                char c = s.charAt(i);
                if(isDigit(s.charAt(i))==false)
                    return false;
            }
        }
        return true;
    }
    else
        return false;
}
public static boolean isDigit(char c){
    if((c == '0') || (c == '1') || (c == '2') || (c == '3') || 
    (c == '4') || (c == '5') || (c == '6') || (c == '7') || 
    (c == '8') || (c == '9'))
        return true;
    else
        return false;

}
public static boolean isDash(char c){
    if(c == '-')
        return true;
    else
        return false;
}

}

我更喜欢帮助而不是答案,因为我现在正在学习如何编码。

ANSWER

import java.io.File;
import java.util.Scanner;

public class Lab14 {
public static void main(String[] args)throws Exception {
    File file = new File("C:\\Documents and Settings\\Russell\\Desktop\\Social-Security-Numbers.txt");
    Scanner input = new Scanner(file);
        String case1 = input.nextLine();
        String case2 = input.nextLine();
        String case3 = input.nextLine();
        String case4 = input.nextLine();
    input.close();
    System.out.println("The first case is: " + case1 + ". This is a " + validSSN(case1) + " entry.");
    System.out.println("The second case is: " + case2 + ". This is a " + validSSN(case2) + " entry.");
    System.out.println("The third case is: " + case3 + ". This is a " + validSSN(case3) + " entry.");
    System.out.println("The fourth case is: " + case4 + ". This is a " + validSSN(case4) + " entry.");
}
public static boolean validSSN(String s){
    if (s.length() == 11){
        for(int i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            if(isDigit(s.charAt(i))==true && ((isDash(s.charAt(3))==true) && isDash(s.charAt(6))==true)){
                    return true;
        }
        else
            return false;
        }
        return false;
}
    else return false;
}
public static boolean isDigit(char c){
    if((c == '0') || (c == '1') || (c == '2') || (c == '3') || 
    (c == '4') || (c == '5') || (c == '6') || (c == '7') || 
    (c == '8') || (c == '9'))
        return true;
    else
        return false;
}
public static boolean isDash(char c){
    if(c == '-')
        return true;
    else
        return false;
}

}

2 个答案:

答案 0 :(得分:1)

我将勾勒出我认为你可以用一些逻辑和谷歌搜索轻松解决的问题。

  1. 正如我评论的那样,您需要找到一种方法来遍历您传递给validSSN(String s)的字符串中的每个字符,
  2. 例如:

    s = '123-45-6789'  
    

    你想循环1,然后是2,等等。这些字符中的每一个都在字符串&#39;中保留一个位置,从索引0到10开始。

    谷歌,看看你找到了什么。如果您没有看到有用的内容,请查看this link

    1. 当您循环浏览每个字符时,您要测试每个字符,以确定它是一个数字,对于isDigit(char c)方法,还是短划线,isDash(char c)
    2. Google&#34;检查char是否为数字java&#34;。如果您没有找到任何内容,请参阅link。测试char是否是破折号,&#39; - &#39;应该很容易找到。

      这应该照顾isDigit(char c)isDash(char c)

      1. 你需要在validSSN(String s)中实现一些逻辑,这样当你遍历每个字符时,你会检查:
      2. a)如果在适当的索引处,char是一个数字,否则返回false

        b)如果在适当的索引处,char是破折号,否则返回false

        如果所有char都通过了你的逻辑,那么返回true。

        你的主要代码中还有一些我不确定发生了什么的代码,即

        String case1 = input.nextLine();
        String case2 = input.nextLine();
        String case3 = input.nextLine();
        String case4 = input.nextLine();
        

        但我认为一旦你得到1.到3,你就会全力以赴。

        [编辑来解决您的错误:

        SPOILER ALERT 如果你继续阅读我会给出答案。所以请坚持下去,如果你放弃,请查看下面的内容并弄清楚为什么会这样,你的代码也没有。

        因此对于if-else逻辑,我首先测试某些东西是否为假,可能有几种情况,所以当你通过所有这些时,然后返回true。可能有更好的方法来编写以下代码,但我认为这是可以理解的:

        public static boolean validSSN(String s){
            // don't bother doing anything else if the length is wrong
            if (s.length() != 11) { return false; } 
            else {
                for(int i = 0; i < s.length(); i++) {
                    char c = s.charAt(i); 
                    // now that you have c, use it. Don't do s.charAt(i) again.
        
                    // if index is both {not 3 AND not 6} do...
                    if ((i != 3) && (i != 6)) {
        
                        // you don't need to check "isDigit(s.charAt(i))==false"
                        if (!isDigit(c)) { return false; } // if not numeric, return false
                    }
                    // here we are either index i=3 OR i=6, so if c is not a dash return false
                    else if (!isDash(c)) { return false; }
                }
                // at this point we exhausted our loop and couldn't 
                // find anything false, so return true
                return true;        
            }
        }    
        

        结束编辑 ]

答案 1 :(得分:0)

验证破折号:

StringBuilder caseStringBuilder = new StringBuilder(String.valueOf("346-45-3456"));
if(caseStringBuilder.substring(3,4).equalsIgnoreCase("-") && caseStringBuilder.substring(6,7).equalsIgnoreCase("-")){
    System.out.println("Dashes validated successfully");
}else{
    System.out.println("Dash validatioin failed");
} 

刚刚在短划线的位置取出子串并进行比较。

用于检查数字字段:

StringBuilder caseStringBuilder = new StringBuilder(String.valueOf("346-45-3456"));
if((caseStringBuilder.substring(0,3)+caseStringBuilder.substring(4,6)+caseStringBuilder.substring(7,11)).matches(".*\\d.*")){
            System.out.println("It contains only numbers");
        }

再次获取子串并将它们全部添加。然后运行验证那些是否是数字。

如果您需要任何进一步的详细信息,请与我们联系。