如何从类似于 423e
的字符串中获取 int 值,即包含数字但也可能包含字母的字符串?
Integer.parseInt()
无法成功转换这样的字符串,因为该字符串必须完全是数字。
将所有非数字字符替换为空格:剩下的字符串只包含数字。
Integer.parseInt(s.replaceAll("[\\D]", ""))
这也会删除数字之间的非数字字符,所以"x1x1x"
会变成11
。
如果您需要确认字符串由数字序列(至少一个)可能跟随一个字母组成,则可以使用以下代码:
s.matches("[\\d]+[A-Za-z]?")
NumberFormat类只会解析字符串,直到遇到无法解析的字符为止:
((Number)NumberFormat.getInstance().parse("123e")).intValue()
因此将返回123。
除非您谈论的是十六进制数(对于这种情况,有一种方法可以将其解析为十六进制),否则您需要明确地分离出您感兴趣的部分,然后进行转换。毕竟,像23e44e11d这样的东西在十进制中会有什么语义呢?
如果您确定只有一个数字,那么正则表达式可能是解决方法。Java内置了一个正则表达式解析器。
如果另一方面,您的目的是将所有数字连接起来并且忽略字母,则可以通过迭代每个字符来使用StringBuilder构建一个字符串,然后解析该字符串来实现。
只需遍历字符串,像往常一样建立一个整数,但忽略非数字字符:
int res = 0;
for (int i=0; i < str.length(); i++) {
char c = s.charAt(i);
if (c < '0' || c > '9') continue;
res = res * 10 + (c - '0');
}
res = res * 10 + c - '0';
。 - benkcScanner s = new Scanner(MyString);
s.nextInt();
new Scanner("456e").useDelimiter("\\D").nextInt()
中的任何正则表达式进行更改。 - Diogo Kollross或许可以先获得字符串的大小,然后循环遍历每个字符并在每个字符上调用isDigit()方法。如果它是数字,则将其添加到一个仅收集数字的字符串中,在调用Integer.parseInt()之前。
像这样:
String something = "423e";
int length = something.length();
String result = "";
for (int i = 0; i < length; i++) {
Character character = something.charAt(i);
if (Character.isDigit(character)) {
result += character;
}
}
System.out.println("result is: " + result);