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