Java: поиск нескольких разделителей - PullRequest
1 голос
/ 03 марта 2011

Я пытаюсь отделить часы, минуты, секунды и миллисекунды от введенного времени.Прямо сейчас у меня есть

public MillisTime(String str)
throws IllegalArgumentException {
    // Initialize values so that missing fields default to 0.
    int hours = 0, minutes = 0, seconds = 0, millis = 0;

    // Use Scanner class to parse the time string.
    // Catch InputMismatchException and rethrow IllegalArgumentException.
    Scanner scn = new Scanner(str);

    scn.useDelimiter(":");
    try {
        if (scn.hasNext()) hours = scn.nextInt();
        if (scn.hasNext()) minutes = scn.nextInt();
        if (scn.hasNext()) seconds = scn.nextInt();

        scn.useDelimiter(".");
        if (scn.hasNext()) millis = scn.nextInt();
    }
    catch (InputMismatchException ex) {
        throw new IllegalArgumentException(
                                           "String Input Mismatch Exception: " + str);
    }
    scn.close();
    this.setAllFields(hours, minutes, seconds, millis);
}

Вход, который он получает, - "16:5:7.009", и в результате получается String Input Mismatch Exception.Если я уберу строки, которые ищут период и миллис, и введу что-то вроде 3:45, это сработает.Как мне заставить эту работу найти : и .?

Ответы [ 2 ]

1 голос
/ 03 марта 2011

Исключение происходит потому, что с разделителем ":" подкомпоненты равны {16, 5, 7.009}. 7,009 не является целым числом, поэтому, когда вы в третий раз звоните scanner.nextInt(), вы получаете исключение.

Имейте в виду, что используемый сканер разделителя может быть шаблоном regEx, поэтому разделитель может быть одновременно . OR ::

scanner.useDelimiter(Pattern.compile("[\\.:]");
1 голос
/ 03 марта 2011

Зачем вам нужно использовать сканер, так как ввод является строкой?

Я предлагаю вам использовать http://download.oracle.com/javase/6/docs/api/java/lang/String.html#split(java.lang.String) для отделения строки от разделителей.

Или, для более элегантного решения, используйте http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

Вот пример использования регулярных выражений для проверки и разбиения строки для извлечения чисел (просто для использования двух методов):

public class MillisTime {
    public MillisTime(String str)
    throws IllegalArgumentException {
        // Initialize values so that missing fields default to 0.
        int hours = 0, minutes = 0, seconds = 0, millis = 0;

        if(!str.matches("[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\\.[0-9]*")) {
            throw new IllegalArgumentException("String must in the pattern: ##:##:##.###(...)");
        }

        String[] splitted = str.split(":");
        if(splitted.length != 3) {
            throw new IllegalArgumentException("String Input Mismatch Exception: " + str);                
        }
        hours = Integer.parseInt(splitted[0]);
        minutes = Integer.parseInt(splitted[1]);
        String[] secondsAndMillis = splitted[2].split("[.]");
        seconds = Integer.parseInt(secondsAndMillis[0]);
        millis = Integer.parseInt(secondsAndMillis[1]);
        this.setAllFields(hours, minutes, seconds, millis);
    }

    private void setAllFields(int hours, int minutes, int seconds, int millis) {

    }

    public static void main(String[] args) {
        new MillisTime("12:13:14.123");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...