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