Java 扫描仪从字符串中获取数字
Java Scanner get number from string
字符串是,例如 "r1"
,我需要 int
形式的 1
Scanner sc = new Scanner("r1");
int result = sc.nextInt(); // should be 1
编译正确但有运行时错误,我应该使用定界符吗?我不确定分隔符的作用。
如果所有输入的格式都相同,其中最后一个字符是您可以使用的值:
String s = sc.nextLine()
Int i = Integer.parseInt(s.charAt(s.length() -1));
否则,例如,您可以将字符串设为一个 char 数组,遍历它并检查每个 char 是否是一个数字。
好吧,有几个选项。因为你真的想 跳过 "r" 然后读取数字,你可以使用 Scanner#skip
。例如,要跳过所有非数字然后读取数字:
Scanner sc = new Scanner("r1");
sc.skip("[^0-9]*");
int n = sc.nextInt();
如果没有前导非数字,这也有效。
如您所述,另一种选择是使用非数字作为分隔符。例如:
Scanner sc = new Scanner("x1 r2kk3 4 x56y 7g");
sc.useDelimiter("[^0-9]+"); // note we use + not *
while (sc.hasNextInt())
System.out.println(sc.nextInt());
输出六个数字:1、2、3、4、56、7。
根据您输入的性质,另一种选择是通过提前将所有非数字替换为空格来预处理字符串,然后使用默认配置的扫描仪,例如:
String input = "r1";
input = input.replaceAll("[^0-9]+", " ");
而且,当然,如果您知道第一个字符是那种形式,您总是可以只预处理字符串以删除第一个字符,然后使用扫描仪(或只是 Integer#parseInt
):
String input = "r1";
input = input.substring(1);
你做什么取决于最适合你输入的内容。将 "non-digit" 替换为您要跳过的任何内容。
顺便信个灯scolding is in order for this:
Im unsure what the delimiter does.
介绍文本中 Scanner
explains this quite clearly 的文档,甚至还显示了一个示例。
另外,"delimiter"这个词的定义本身就是readily available。
这里有一些基本错误。
首先,你说:
One = sc.nextInt("r1");
compiles correctly ...
不,不是。如果sc
真的是java.util.Scanner
,那么就没有Scanner.nextInt(String)
方法,所以无法编译。
第二个问题是 hasNextXXX
和 nextXXX
方法不解析它们的参数。他们解析扫描仪输入源中的字符。
第三个问题是 Scanner
没有提供一种方法来完成您(显然)正在尝试做的事情。
如果您的 String
s
包含值 "r1"
,那么您根本不需要 Scanner
。您需要为我们做这样的事情:
String s = ...
int i = Integer.parseInt(s.substring(1));
或者可能是这样的:
Matcher m = Pattern.compile("r(\d+)").matcher(s);
if (m.matches()) {
int i = Integer.parseInt(m.group(1));
}
... 在提取数字之前检查字段是否为预期格式。
另一方面,如果你真的想从扫描器中读取字符串,你可以这样做:
String s = sc.next();
然后提取上面的数字
字符串是,例如 "r1"
,我需要 int
形式的 1
Scanner sc = new Scanner("r1");
int result = sc.nextInt(); // should be 1
编译正确但有运行时错误,我应该使用定界符吗?我不确定分隔符的作用。
如果所有输入的格式都相同,其中最后一个字符是您可以使用的值:
String s = sc.nextLine()
Int i = Integer.parseInt(s.charAt(s.length() -1));
否则,例如,您可以将字符串设为一个 char 数组,遍历它并检查每个 char 是否是一个数字。
好吧,有几个选项。因为你真的想 跳过 "r" 然后读取数字,你可以使用 Scanner#skip
。例如,要跳过所有非数字然后读取数字:
Scanner sc = new Scanner("r1");
sc.skip("[^0-9]*");
int n = sc.nextInt();
如果没有前导非数字,这也有效。
如您所述,另一种选择是使用非数字作为分隔符。例如:
Scanner sc = new Scanner("x1 r2kk3 4 x56y 7g");
sc.useDelimiter("[^0-9]+"); // note we use + not *
while (sc.hasNextInt())
System.out.println(sc.nextInt());
输出六个数字:1、2、3、4、56、7。
根据您输入的性质,另一种选择是通过提前将所有非数字替换为空格来预处理字符串,然后使用默认配置的扫描仪,例如:
String input = "r1";
input = input.replaceAll("[^0-9]+", " ");
而且,当然,如果您知道第一个字符是那种形式,您总是可以只预处理字符串以删除第一个字符,然后使用扫描仪(或只是 Integer#parseInt
):
String input = "r1";
input = input.substring(1);
你做什么取决于最适合你输入的内容。将 "non-digit" 替换为您要跳过的任何内容。
顺便信个灯scolding is in order for this:
Im unsure what the delimiter does.
介绍文本中 Scanner
explains this quite clearly 的文档,甚至还显示了一个示例。
另外,"delimiter"这个词的定义本身就是readily available。
这里有一些基本错误。
首先,你说:
One = sc.nextInt("r1");
compiles correctly ...
不,不是。如果sc
真的是java.util.Scanner
,那么就没有Scanner.nextInt(String)
方法,所以无法编译。
第二个问题是 hasNextXXX
和 nextXXX
方法不解析它们的参数。他们解析扫描仪输入源中的字符。
第三个问题是 Scanner
没有提供一种方法来完成您(显然)正在尝试做的事情。
如果您的 String
s
包含值 "r1"
,那么您根本不需要 Scanner
。您需要为我们做这样的事情:
String s = ...
int i = Integer.parseInt(s.substring(1));
或者可能是这样的:
Matcher m = Pattern.compile("r(\d+)").matcher(s);
if (m.matches()) {
int i = Integer.parseInt(m.group(1));
}
... 在提取数字之前检查字段是否为预期格式。
另一方面,如果你真的想从扫描器中读取字符串,你可以这样做:
String s = sc.next();
然后提取上面的数字