【问题标题】:To check is passed string parsable to Integer?检查是否将可解析的字符串传递给整数?
【发布时间】:2014-09-29 11:15:29
【问题描述】:

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

我是这样做的:

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

这样做是不是不好?

【问题讨论】:

  • 没有。这还不错(因为您正在处理异常)。虽然你也可以string.matches("\\d+") 看看它是否只包含数字。
  • 我不认为它坏,但有更好的方法来做到这一点。一个简单的while 检查每个字符是否都是数字(注意第一个也可以是+ 或-),或者正则表达式匹配会更好。如果字符串不可解析,这将避免生成堆栈跟踪
  • 我认为您的代码已经做到了最好。另请注意,HotSpot 对当场捕获且未在 catch 块中取消引用的异常进行了特定优化。它将完全编译为您想要的代码(不生成堆栈跟踪等)。
  • @MansoorSiddiqui 不需要处理整数的小数。
  • 我的意思是最后带有“.0”的整数。 Integer.parseInt(String) 将解析那些就好了。

标签: java string integer


【解决方案1】:

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

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

方法2:使用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;
    }
}

【讨论】:

  • 我认为字符串应该匹配[+-]?\d+。可以有负整数(因此字符串以- 开头)和以+ 开头的正整数
【解决方案2】:

我会使用:

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

【讨论】:

  • 请在此行添加分号。 value = Integer.valueOf(s) ;
  • Java 索引从 0 开始,因此 if (s.length == 0) {... 是错误的。应该是if (s.length < 0) {... ;)
  • 是的,你是对的,Java 索引从 0 开始,但我不明白你的意思!让我指出s.length() < 0 始终是false!
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多