在Java中从包含字母的字符串中获取整数

37

如何从类似于 423e 的字符串中获取 int 值,即包含数字但也可能包含字母的字符串?

Integer.parseInt() 无法成功转换这样的字符串,因为该字符串必须完全是数字。


不了解Java,但我知道你可以用正则表达式来做这件事。首先去掉所有不是0-9的字符,然后将剩下的内容转换为整数。这是你要找的那种东西吗? - matt lohkamp
6个回答

92

将所有非数字字符替换为空格:剩下的字符串只包含数字。

Integer.parseInt(s.replaceAll("[\\D]", ""))

这也会删除数字之间的非数字字符,所以"x1x1x"会变成11

如果您需要确认字符串由数字序列(至少一个)可能跟随一个字母组成,则可以使用以下代码:

s.matches("[\\d]+[A-Za-z]?")

22

NumberFormat类只会解析字符串,直到遇到无法解析的字符为止:

((Number)NumberFormat.getInstance().parse("123e")).intValue()

因此将返回123。


1
还有getIntegerInstance() - mlt

10

除非您谈论的是十六进制数(对于这种情况,有一种方法可以将其解析为十六进制),否则您需要明确地分离出您感兴趣的部分,然后进行转换。毕竟,像23e44e11d这样的东西在十进制中会有什么语义呢?

如果您确定只有一个数字,那么正则表达式可能是解决方法。Java内置了一个正则表达式解析器。

如果另一方面,您的目的是将所有数字连接起来并且忽略字母,则可以通过迭代每个字符来使用StringBuilder构建一个字符串,然后解析该字符串来实现。


谢谢,我使用了正则表达式完成了它。虽然我认为可能会有内置的方法可用。 - DisgruntledGoat

6

只需遍历字符串,像往常一样建立一个整数,但忽略非数字字符:

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'; - benkc

6
您也可以使用Scanner:
Scanner s = new Scanner(MyString);
s.nextInt();

1
Scanner类假定空格为标记之间的分隔符,但可以通过new Scanner("456e").useDelimiter("\\D").nextInt()中的任何正则表达式进行更改。 - Diogo Kollross

2

或许可以先获得字符串的大小,然后循环遍历每个字符并在每个字符上调用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);

3
算法正确,但你应该使用StringBuilder来添加结果。 - Steve Kuo
3
同意。我想当匆忙打字时,人们并不总是能做到完美。 - digiarnie
最好别那么着急。在循环中连接字符串是你可能做的最糟糕的事情之一。而且即使过去6年了,这个问题仍然没有被解决。 - Vlasec
要是有一个编辑链接就好了... - takendarkk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接