Форматирование строк в классе 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" часть строки, так, какова команда для пробела? Спасибо

Ответ 1

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

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 Результат

Однако, если вы действительно намерены для своих пользователей нажимать Enter после каждого ввода, то было бы наиболее согласованным прочитать все входы с помощью метода Scanner 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

Ответ 2

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

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

String str=i.next();

:

String str=i.nextLine();

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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"), то этот код выдает вам все пробелы без пропусков.