要检查是否将字符串传递为可解析为 Integer?

To check is passed string parsable to Integer?

提问人:St.Antario 提问时间:9/29/2014 更新时间:2/28/2018 访问量:10511

问:

我想检查是我传递给有效字符串进行解析。如果一个不可解析,我需要返回 0。StringInteger.valueOf(String s)

我通过以下方式进行操作:

try{
    Integer.valueOf(String s)
} catch(NumberFormatException e) {
    return 0;
}

这样做是不是很糟糕?

Java 字符串 整数

评论

1赞 TheLostMind 9/29/2014
不。这还不错(因为您正在处理异常)。虽然你也可以看看它是否只包含数字。string.matches("\\d+")
0赞 BackSlash 9/29/2014
我不认为这不好,但有更好的方法可以做到这一点。一个简单的检查每个字符是否都是一个数字(注意第一个也可以是 或),或者正则表达式匹配会更好 IMO。这将避免在字符串不可解析时生成堆栈跟踪while+-
1赞 Marko Topolnik 9/29/2014
我认为你的代码已经尽善尽美了。另请注意,HotSpot 对当场捕获且未在捕获块中取消引用的异常进行了特定优化。它将完全编译为您想要的代码(不生成堆栈跟踪等)。
1赞 Marko Topolnik 9/29/2014
@MansoorSiddiqui 无需处理整数的小数。
1赞 Mansoor Siddiqui 9/29/2014
我的意思是末尾带有“.0”的整数。Integer.parseInt(String) 可以很好地解析它们。

答:

7赞 Vipul Paralikar 9/29/2014 #1

方法 1:使用正则表达式检查作为数字的有效性

public static int parseStrToInt(String str) {
        if (str.matches("\\d+")) {
            return Integer.parseInt(str);
        } else {
            return 0;
        }
    }

方法二:使用Java内置的java.text.NumberFormat对象,查看解析字符串后解析器的位置是否在字符串的末尾。如果是,我们可以假设整个字符串都是数字

public static int strToInt(String str) {
    NumberFormat formatter = NumberFormat.getInstance();
    ParsePosition pos = new ParsePosition(0);
    formatter.parse(str, pos);

    if (str.length() == pos.getIndex()) {
        return Integer.parseInt(str);
    } else {
        return 0;
    }
}

评论

4赞 BackSlash 9/29/2014
我认为字符串应该匹配.可以有负整数(所以字符串以 )和正整数(以 开头)和[+-]?\d+-+
1赞 srinivasan Elangovan 9/29/2014 #2

嗨,即使数字是双倍或长,这也会做,这在解析时总是有用的。

List<String> myStrings = new ArrayList<String>();

myStrings.add("text");
myStrings.add("25");
myStrings.add("102.23333333");
myStrings.add("22.34");

NumberFormat nf = NumberFormat.getInstance();
for( String text : myStrings){
    try {
        System.out.println( nf.parse(text));
    } catch (ParseException e) {
        e.printStackTrace();
    }
}
4赞 yaser eftekhari 9/29/2014 #3

我会使用:

s = s.trim(); // sometimes user inputs white spaces without knowing it
int value;
if (s.length() == 0) {
    value = 0; // obviously not a string
} else {
    try{
        value = Integer.valueOf(s);
    } catch(NumberFormatException e) {
        value = 0;
    }
}

// do whatever you like here

评论

0赞 Mann 5/31/2017
请在该行添加分号。值 = Integer.valueOf(s) ;
0赞 Cardinal System 6/22/2017
Java 索引从 0 开始,因此是错误的。它应该是if (s.length == 0) {...if (s.length < 0) {... ;)
0赞 yaser eftekhari 6/24/2017
是的,你是对的,Java 索引从 0 开始,但我不明白你的意思!让我指出,这总是!s.length() < 0false