Java Scanner类中的字符串格式

时间:2017-02-26 16:40:00

标签: java string formatting

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);

我的问题是格式化我通过扫描仪输入的字符串。我试图输入"结果是",但printf()似乎只看到"结果"字符串的一部分,那么空格命令是什么? thx

5 个答案:

答案 0 :(得分:2)

有几种可能的解决方案,但我相信以下内容将为您提供与其他输入一致的行为:

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及更早版本

linebreak matcher \R在Java-8或更高版本中可用。在该版本之前,您必须使用&#34;等效的&#34;模式\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

答案 1 :(得分:0)

  

我的问题是格式化我通过扫描仪输入的字符串。一世   我试图进入&#34;结果是&#34;,但是printf()似乎只看到了   &#34;结果&#34;字符串的一部分

改变这一点:

String str=i.next();

到此:

String str=i.nextLine();

next()只会返回空格前的内容。另一方面,nextLine()返回包含单词之间空格的输入。

答案 2 :(得分:0)

好的,你可以做出这样的伎俩,只需添加新的字符串ang打印

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

答案 3 :(得分:0)

即使是几天前我遇到此问题,在我要求输入int或double之后,我也不得不输入新行。我用这个解决了-

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

“扫描是我的扫描仪对象的名称”。

看,这里我使用scan.skip("\n);,因为当您输入一个数字时,它仅消耗该数字,而不消耗行尾。因此scan.skip("\n")跳过了缓冲区中仍然存在的那一行,因此,当我们再次扫描时,它从新行开始,并得到了所需的字符串。 希望对您有帮助!

答案 4 :(得分:0)

使用此

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编码器”)的字符串,那么此代码将带您使用所有空白,而无需任何跳过。