2016-04-11 5 views
0

İşte benim kodum, bu sorunun veya benzerliğin daha önce yayınlandığını anlıyorum. Karşılaştığım çatışma, "regex" kullanmamam gerekiyordu. Bu programın yazılmasının daha basit bir yolu olduğunu biliyorum, ama sınıfımda henüz gitmiş olduğumuz bir şey değil. Ben kolay cevaplar, sadece ipuçları arıyorum DEĞİL.Bir SSN'yi çok spesifik bir şekilde doğrulamam gerekiyor

public class SSNValidatorApp { 
    public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 
     String ssn = Validator.getSSN(sc, "Enter a Social Security Number: "); 

     System.out.println("You entered: " + ssn); 
    } 
} 

Yani bu benim kodunda meselenin istemeniz gerekir sonunda geliyor görüntü çıkışı için birinci sınıf,

public static boolean isDigit(char c) { 
    return Character.isDigit(c); 
} 

public static boolean isDash(char c) { 
    return (c == '-'); 
} 

public static String getSSN(Scanner sc, String prompt) { 
    System.out.println(prompt); 
    String ssn = sc.next(); 
    String tryAgain = "y"; 

    while (tryAgain.equalsIgnoreCase("y")) { 
     if (ssn.length() != 11) { 
      System.out.println(ssn + " is not a valid SSN"); 
      sc.nextLine(); 
     } 

     for (int i = 0; i < ssn.length(); i++) { 
      if (i <= 2) { 
       if (!isDigit(ssn.charAt(i))) { 
        System.out.println(ssn + " is not a valid SSN"); 
        sc.nextLine(); 
       } 
       else if (i == 3) { 
        if (!isDash(ssn.charAt(i))) { 
         System.out.println(ssn + " is not a valid SSN"); 
         sc.nextLine(); 
        } 
       } 
       else if (i == 6) { 
        if (!isDash(ssn.charAt(i))) { 
         System.out.println(ssn + " is not a valid SSN"); 
         sc.nextLine(); 
        } 

       } 
       else if (i > 6) { 
        if (!isDigit(ssn.charAt(i))) { 
         System.out.println(ssn + " is not a valid SSN"); 
         sc.nextLine(); 
        } 
       } 
      } 
     } 

     tryAgain = Validator.getString(sc, "Would you like to re-enter your SSN? (y/n): "); 
     System.out.println(); 
    } 

    return ssn; 
} 

olan "sen istiyorum tekrar girmek SSN? Cevapladıkları y ya da n tek sorun, cevap verdiklerinde "" DDD-DD-DDDD "nin geçerli bir SSN olmadığını söylemeye devam ediyorlar./Açıklamalarım var iken

Teşekkür ederiz

+0

Kodunuzu ayıklamanız gerekir. Bir hata mesajı verdiğiniz her şey, döngüden kopmaz ve hata mesajlarını yazdırmaya devam etmezsiniz. –

+0

Düzenli bir ifade kullanın. Burada birçok farklı ifade bulabilirsiniz: http://www.regxlib.com/Search.aspx?k=ssn –

+2

'i <= 2' ve' i == 3'ün her ikisinin de doğru olmasını nasıl bekliyorsunuz? –

cevap

3

Kullanıcıyı ssn için döngünün başlangıcında sorgulamanız gerekir, yani, String ssn = sc.next();'u while-blokunun en üstüne koyun.

Şu anda kullanıcıyı bir kez sorguladığınızda, while bloğundan sonra, doğrulamadan yeni bir tane almak yerine ssn değerini yeniden kullanırsınız.

+0

Bahşiş için teşekkürler, bilgisayarıma döndüğümde uygulamaya çalışacağım. – RonaveCode

+0

İlk bloğu olan ve komut istemini en başa yerleştiren ve sorunsuz bir şekilde çalışan sınıfa süre kodunu ekledik, bilgi için teşekkürler. – RonaveCode

0

For döngüsü oldukça gereksiz ve her şey çok daha ayrıntılı hale getiriyor. Bir normal ifadeyi kullanamıyorsanız, her karakterdeki koşulları sabit kodla yazmanız yeterlidir:

if (ssn.length() != 11 
    || !isDigit(ssn.charAt(0)) 
    || !isDigit(ssn.charAt(1)) 
    || !isDigit(ssn.charAt(2)) 
    || !isDash(ssn.charAt(3)) 
    || !isDigit(ssn.charAt(4)) 
    || !isDigit(ssn.charAt(5)) 
    || !isDash(ssn.charAt(6)) 
    || !isDigit(ssn.charAt(7)) 
    || !isDigit(ssn.charAt(8)) 
    || !isDigit(ssn.charAt(9)) 
    || !isDigit(ssn.charAt(10))) { 
    System.out.println(ssn + " is not a valid SSN"); 
    sc.nextLine(); 
} 
+0

Yanıt için teşekkürler, bilgisayarıma geri döndüğümde bunu deneyeceğim. – RonaveCode

+0

Bu blok, kodun kısaltılmasına yardımcı oldu, teşekkürler. – RonaveCode

İlgili konular