【问题标题】:Java while loop and prompt userJava while循环和提示用户
【发布时间】:2015-01-04 06:00:12
【问题描述】:

我有一个用户输入他们的社会安全号码(假号码),我需要它的格式为 111-11-1111,包括破折号。如果用户输入的信息没有破折号,或者超过 999-99-9999,程序会提示用户输入正确的信息。这是我的代码,我该如何解决?另外,我可以在其中的任何部分使用StringBuilder 吗?

import java.util.Scanner;
import java.lang.StringBuilder;
import java.lang.Math; 
 class TaxReturn
 {
 public static void main(String[] args)
 {
 String firstName, mI, lastName;
 char M;
 char S;
 int SSN;
 final int SSNLimit = 999999999;
 int zip;
 int income;
 int pets;
 int vehicle;
 int toaster;


 //Start string firstName   
  Scanner inputDevice = new Scanner(System.in);
  System.out.print("First name: ");
  firstName = inputDevice.next();

 //Start middle name
  System.out.print("Middle initial: ");
  mI = inputDevice.next();

 //Start lastName
  System.out.print("Last name: ");
  lastName = inputDevice.next();

 //Start SSN (Social Security Number)
  System.out.print("What is your Social Security Number?: ");
  SSN = inputDevice.nextInt();
  while(SSN > SSNLimit)
  {
     System.out.print("Invalid entry, please enter a valid Social Security Number");
     System.out.print("\nPlease enter your Social again:");
     SSN = inputDevice.nextInt();
  }
}
}

【问题讨论】:

  • 如果您告诉我们您遇到的错误,这将非常有帮助,这样我们可以更快地为您提供帮助。
  • 我没有收到错误消息。在代码的最后一部分,我想知道是否有办法让代码识别社会安全号码中的破折号。其他所有数字。例如 999-99-9999 而不是 999999999
  • 利用正则表达式 "^\d{3}-\d{2}-\d{4}$" 检测格式是否正确
  • @Ajinkay Pisal,我对此并不熟悉。有什么地方可以读到吗?它的技术名称是什么?正则表达式?

标签: java loops stringbuilder with-statement


【解决方案1】:

您正在使用 nextInt() 读取一个值。但在您的情况下,它不是整数值,因为它包含“-”。因此使用输入作为字符串然后应用正则表达式来检查输入的字符串是否是有效的格式。

SSN 的匹配可以使用正则表达式

String pattern = "^\d{3}-\d{2}-\d{4}$";

  // Create a Pattern object
  Pattern ssnPattern = Pattern.compile(pattern);
  SSN = inputDevice.next();
  // Now create matcher object.
  Matcher m = ssnPattern.matcher(SSN);
  if(m.matches()){
    //valid
  }else{
   // invalid
  }

或者如下评论中给出的(在一行代码中)

 if (SSN.matches("^\\d{3}-\\d{2}-\\d{4}$")){
  //valid ssn
  }
  else {
  //invalid ssn 
  }

但是您应该坚持第一种方法,因为它会执行多次 SSN 验证。 由于匹配器被预编译,因此每次执行代码时重新编译的 string.matches 是有效的

What's the difference between String.matches and Matcher.matches?

【讨论】:

  • 您可以在您的正则表达式中使用if (!SSN.matches(pattern)) {//...error...} 并转义“\”。
  • 谢谢,我将阅读您提供的链接并改用字符串。
  • @almasshaikh 您的代码确实有效。但据你所知,当某些片段被多次执行时,Matcher 比 string.matches 更好。
  • 当你已经有 API 时,不要重新发明轮子。你应该避免过度优化代码..
  • @almasshaikh 让它工作和让它高效工作是两件事。让它以有效的方式工作会让你成为更好的程序员。期间。
【解决方案2】:

这是根据您的代码修改的版本。

import java.util.Scanner;

public class TaxReturn {

public static void main(String[] args) {
    String firstName, mI, lastName;
    char M;
    char S;
    int SSN;
    final int SSNLimit = 999999999;
    int zip;
    int income;
    int pets;
    int vehicle;
    int toaster;

    // Start string firstName
    Scanner inputDevice = new Scanner(System.in);
    System.out.print("First name: ");
    firstName = inputDevice.next();

    // Start middle name
    System.out.print("Middle initial: ");
    mI = inputDevice.next();

    // Start lastName
    System.out.print("Last name: ");
    lastName = inputDevice.next();

    // Start SSN (Social Security Number)
    System.out.print("What is your Social Security Number?: ");
    while (true) {
        String s = inputDevice.next();
        if (s.matches("^\\d{3}-\\d{2}-\\d{4}$")) {
            int i = Integer.valueOf(s.replaceAll("-", ""));
            if (i < SSNLimit) {
                SSN = i;
                System.out.println("SSN is " + SSN);
                break;
            } else {
                System.out.print("Invalid entry, please enter a valid Social Security Number");
                System.out.print("\nPlease enter your Social again: ");
                continue;
            }
        } else {
            System.out.print("Invalid entry, please enter a valid Social Security Number");
            System.out.print("\nPlease enter your Social again: ");
            continue;
        }
    }
    inputDevice.close();
}
}

【讨论】:

  • 当我提示正确的社交时收到此错误。线程“主”java.lang.IllegalStateException 中的异常:扫描仪已关闭
【解决方案3】:

由于您接受 ssn 作为整数,您可以检查数字范围,即 9digit 数字范围,并且可以执行以下操作:

final int ssnEndLimit = 999999999;
final int ssnStartLimit = 100000000;
while(SSN > ssnEndLimit || SSN < ssnStartLimit) {//if its not 9 digits exactly
    ...
}
//Now Format as per OP's requirement
String formattedSSN = formatSSN(SSN);

private static String formatSSN(int ssn) {
    DecimalFormat ssnDecimalFmt = new DecimalFormat("000000000");
    String ssnRawString = ssnDecimalFmt.format(ssn);
    MessageFormat ssnMsgFmt = new MessageFormat("{0}-{1}-{2}");
    String[] ssnNumArr = {ssnRawString.substring(0, 3), ssnRawString.substring(3, 5), ssnRawString.substring(5)};
    return ssnMsgFmt.format(ssnNumArr));
}

【讨论】:

    【解决方案4】:

    使用正则表达式可能会更好,但您也可以在没有它的情况下制定解决方案。您可能希望像这样验证社会安全号码:

    //I put the validation inside a method to make your code easier to understand
    //input should have "-", so I'm passing it as a string
    public static boolean validate(String s) {
        StringBuilder number = new StringBuilder(s);
        if (number.charAt(3) == '-' && number.charAt(6) == '-') { //check for "-"
            //if the -s is in correct indexes, remove the -s to test all other characters
            number.deleteCharAt(3);
            number.deleteCharAt(5);
            for (int i = 0; i < number.length(); i++) { //are all other characters digits?
                if (!Character.isDigit(number.charAt(i))) {
                    return false;
                }
            }
            //now compute if it is over 999999999
            return (Integer.parseInt(number.toString()) <= 999999999);
        } else {
            return false;
        }
        } 
    

    你可以这样使用它:

    while(!validate(SSN)) //SSN is String in this case
    {
        System.out.print("Invalid entry, please enter a valid Social Security Number");
        System.out.print("\nPlease enter your Social again:");
        SSN = inputDevice.next();
        }
    

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 2018-04-02
      • 2013-04-27
      相关资源
      最近更新 更多