Форматирование строк в классе Java Scanner

Scanner i=new Scanner(System.in);
  System.out.println("Enter an integer: ");
  int in=i.nextInt();
        System.out.println("Enter an floating point number: ");

  double d=i.nextDouble();
        System.out.println("Enter a string: ");

  String str=i.next();
  System.out.printf("%s%n,Sum of%2d and %.2f is %.2f%n",str,in ,d,in+d);

Моя проблема с форматированием строки, которую я ввожу через сканер. Я пытался ввести "Result is", но printf(), кажется, видит только "Result" часть строки, так что же такое команда для пробела? Спасибо

4 ответа

Решение

Есть несколько возможных решений, но я верю, что следующее даст вам согласованное поведение с другими входными данными:

System.out.println("Enter an floating point number: ");
double d = i.nextDouble();
i.skip("((?<!\\R)\\s)*"); // skip whitespace, stopping after any newline

System.out.println("Enter a string: ");
String str = i.nextLine();

Этот подход позволит вам вводить все входные данные в одну строку, если это необходимо.

Например:

1 1.2 Результат

Однако, если вы действительно намерены, чтобы ваши пользователи нажимали клавишу ВВОД после каждого ввода, тогда было бы наиболее согласованно прочитать все входные данные с помощью метода nextLine() Сканера, а затем выполнить синтаксический анализ при необходимости (используя Integer.parseInt и т. Д.).


Java 9

Из-за ошибки в Java 9 атомная группировка (?> ... ) должны быть добавлены вокруг соответствия строки \R, Подробнее см. Отчет об ошибке JDK-8176983.

i.skip("((?<!(?>\\R))\\s)*"); // skip whitespace, stopping after any newline
                              // Compatibility Note: Java 9 safe use of \R

Этот код также будет работать нормально и не вызовет каких-либо проблем при использовании для Java 8, поэтому на самом деле я рекомендую использовать эту версию обходного пути в своем коде, просто чтобы быть в безопасности (например, если кто-то может скопировать / вставить или установить цель для другого JDK).


Java 7 и более ранние

Линии разрыва строки \R доступно в Java-8 или позже. До этой версии вам придется использовать "эквивалентный" шаблон \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029] однако, чтобы работать как истинный эквивалент, он на самом деле должен быть включен в атомную группировку (?> ... ), Подробности см. В отчете об ошибках в документации JDK-8176029.

i.skip("((?<!(?>\\u000D\\u000A|[\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029]))\\s)*"); // skip whitespace, stopping after any newline

Даже я столкнулся с этой проблемой несколько дней назад, когда мне пришлось вводить новую строку сразу после того, как я попросил int или double. Я решил это с помощью этого -

int j=scan.nextInt();
double f=scan.nextDouble();
scan.skip("\n");
String str=scan.nextLine();

msgstr "сканирование - это имя моего объекта сканера".

Видите, здесь я использовал scan.skip("\n); потому что, когда вы вводите число, оно потребляет только это число, а не конец строки. Следовательно scan.skip("\n") пропускает ту строку, которая все еще присутствует в буфере, и, следовательно, при повторном сканировании она начинается с новой строки, и мы получаем желаемую строку. Надеюсь, поможет!

Хорошо, хорошо, вы можете сделать такой трюк, просто добавьте новую строку и печать

String str=i.next();
  String strNew=str;

Моя проблема с форматированием строки, которую я ввожу через сканер. Я пытался ввести "Result is", но printf(), кажется, видит только часть "Result" строки

изменить это:

String str=i.next();

к этому:

String str=i.nextLine();

next() вернет только то, что предшествует пробелу. С другой стороны nextLine() возвращает ввод, включая пробел между словами.

Использовать этот

String[] str;
Scanner i=new Scanner(System.in);
System.out.print("Enter a string: ");
str=i.nextLine().split("");
System.out.println("Enter an integer: ");
int in=i.nextInt();
System.out.println("Enter an floating point number: ");
double d=i.nextDouble();

for(int k=0;k<str.length;k++){
    System.out.print(str[k]);
}
System.out.printf("Sum of%2d and %.2f is %.2f%n", in, d, in+d);

Это однозначно решит ваш ответ, и если вы хотите написать строку наподобие ("Hello Dude Coder"), то этот код выдаст вам все пробелы без пропусков.

Другие вопросы по тегам