如何强制输入特定约定

时间:2020-10-26 05:55:51

标签: java

我正在尝试从用户那里获取一个字符串输入,其输入格式为“ HH:MM am / pm”,例如“ 9:10 am”

稍后将在其中用于显示小时,分钟和上午或下午的输入(在我的Time类中)。

最终,我将实现一个try...except..来检查输入(小时/分钟,它必须是数字,介于0到12之间,并且只能使用am / pm)。 目前,我的代码仅在用户输入HH:MM am/pm(而不是其间的空格)时有效,而在输入(例如)时失败。 9:10pm由于缺少空格。

我的问题-我可以强制输入,以便用户必须遵循某种约定吗?在这种情况下,时间和上午/下午之间必须有空格吗?

在我的客户类中,代码如下:

class Client
{
  public static void main(String[] args)
  {
    // I have removed the Scanner input method and use hardcoded values for now
    String input = "9:10 pm";
    String[] inputSplit = input.split(" ");
    System.out.printf("\ntime:\t%s\n", inputSplit[0]);
    System.out.printf("am/pm:\t%s\n", inputSplit[1]);

    String[] time = inputSplit[0].split (":");
    
    int hour = Integer.parseInt (time[0].trim() );
    int min = Integer.parseInt (time[1].trim() );

    System.out.printf("hr:\t\t%d\n", hour);
    System.out.printf("mins:\t%d\n", min);
  }
}

2 个答案:

答案 0 :(得分:0)

使用replaceAll()在输入的时间中增加宽容度,并使用java.time验证格式

时间格式验证通过以下方式完成:

LocalTime.parse(time, DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH));

在测试平台和上下文中进行时间格式验证:

public static void main(String[] args) {
    List<String> inputList = Arrays.asList("1:10 pm", "02:10PM", "9:10pm"
            , "   11:10   aM   ", "14:10AM", "10:01");

    DateTimeFormatter df = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH);
    for (String input : inputList) {
        // We give the input some tolerance regarding space and small letters
        String time = input.trim()
                .replaceAll("[aA][mM]", " AM")
                .replaceAll("[pP][mM]", " PM")
                .replaceAll("\\s+", " ");

        String formattedTime = "";
        try {
            formattedTime = LocalTime.parse(time, df).format(df);
        } catch (DateTimeParseException dtpe) {
            System.out.printf("%nTime '%s' is not valid!%n", input.trim());
        }

        if(!formattedTime.isEmpty()) {
            String[] splitTime = formattedTime.split("[\\s:]");
            String hourAsString = splitTime[0];
            String minAsString = splitTime[1];
            String amPmAsString = splitTime[2];

            System.out.printf("\ntime:\t%s\n", formattedTime);
            System.out.printf("am/pm:\t%s\n", amPmAsString);

            int hour = Integer.parseInt(hourAsString);
            int min = Integer.parseInt(minAsString);

            System.out.printf("hr:\t\t%d\n", hour);
            System.out.printf("mins:\t%d\n", min);
        }
    }
}

输出:

time:   1:10 PM
am/pm:  PM
hr:     1
mins:   10

time:   2:10 PM
am/pm:  PM
hr:     2
mins:   10

time:   9:10 PM
am/pm:  PM
hr:     9
mins:   10

time:   11:10 AM
am/pm:  AM
hr:     11
mins:   10

Time '14:10AM' is not valid!

Time '10:01' is not valid!

某些“模式字母和符号”的含义:

h   = clock-hour-of-am-pm (1-12)
m   = minute-of-hour
a   = am-pm-of-day

在此处阅读有关“图案字母和符号”的更多信息:

https://docs.oracle.com/javase/10/docs/api/java/time/format/DateTimeFormatter.html#ISO_DATE

答案 1 :(得分:0)

public static void main(String[] args)
      {
        // I have removed the Scanner input method and use hardcoded values for now
        String input = "9:10pm";
        String newTime="";
        String ampm= "";
         if(input.contains("am")) {   
        newTime= input.substring(0,input.indexOf("am"));
        ampm=input.substring(input.indexOf("am"));
         }
         else {
        newTime= input.substring(0,input.indexOf("pm"));
        ampm=input.substring(input.indexOf("pm"));
         }
         newTime=newTime.concat(" ").concat(ampm);
         System.out.println(newTime);
         
        String[] inputSplit = newTime.split(" ");
        System.out.printf("\ntime:\t%s\n", inputSplit[0]);
        System.out.printf("am/pm:\t%s\n", inputSplit[1]);

        String[] time = inputSplit[0].split (":");
        
        int hour = Integer.parseInt (time[0].trim() );
        int min = Integer.parseInt (time[1].trim() );

        System.out.printf("hr:\t\t%d\n", hour);
        System.out.printf("mins:\t%d\n", min);
      }