确定String是否是Java中的整数

Nic*_*ius 287 java string int

我正在尝试确定字符串数组中的特定项是否为整数.

我是表单中.split(" ")'ing的中缀表达式String,然后尝试将结果数组拆分为两个数组; 一个用于整数,一个用于操作符,一个用于丢弃括号和其他杂项.实现这一目标的最佳方法是什么?

我以为我可以找到一种Integer.isInteger(String arg)方法或东西,但没有这样的运气.

cor*_*iKa 328

最天真的方法是遍历String并确保所有元素都是给定基数的有效数字.这几乎和它可能获得的效率一样高,因为你必须至少查看一次每个元素.我想我们可以根据基数对它进行微观优化,但是对于所有意图和目的来说,这都是你期望获得的.

public static boolean isInteger(String s) {
    return isInteger(s,10);
}

public static boolean isInteger(String s, int radix) {
    if(s.isEmpty()) return false;
    for(int i = 0; i < s.length(); i++) {
        if(i == 0 && s.charAt(i) == '-') {
            if(s.length() == 1) return false;
            else continue;
        }
        if(Character.digit(s.charAt(i),radix) < 0) return false;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以依赖Java库来实现此目的.它不是基于异常的,并且可以捕获您能想到的每个错误情况.它会有点贵(你必须创建一个Scanner对象,它在一个你不想做的非常紧凑的循环中.但它通常不应该太昂贵,所以对于日常操作应该非常可靠.

public static boolean isInteger(String s, int radix) {
    Scanner sc = new Scanner(s.trim());
    if(!sc.hasNextInt(radix)) return false;
    // we know it starts with a valid int, now make sure
    // there's nothing left!
    sc.nextInt(radix);
    return !sc.hasNext();
}
Run Code Online (Sandbox Code Playgroud)

如果最佳实践对您无关紧要,或者您想要对进行代码审查的人进行欺骗,请尝试使用以下内容:

public static boolean isInteger(String s) {
    try { 
        Integer.parseInt(s); 
    } catch(NumberFormatException e) { 
        return false; 
    } catch(NullPointerException e) {
        return false;
    }
    // only got here if we didn't return false
    return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 出于某种原因,它们被称为"例外".在一个完美的世界里,你永远不会有例外.说我老板要我做作业.他希望我说"是的,先生!" 但我可能会回答"我现在有很多问题,我不能接受新任务而不让现有工作失败." 他为这两者做好了准备.他不准备让我打他的脸.我失去了工作,他称之为安全.现在想象一下,如果他给我打电话说安全只是说我有太多的工作 - 这是第三种方法:给警察打电话给那些应该被期待的事情. (49认同)
  • 这当然是一种非正统的方式.作为一般规则,您希望避免使用异常来指示执行流.或者正如Joshua Bloch在"有效的Java项目57:仅针对特殊情况使用例外"中所说的那样.他对使用异常迭代数组的评论是`//滥用异常.不要这样做!"实际上 (5认同)
  • "基于非异常的方法"将" - "视为整数. (4认同)
  • 使用非异常方法,字符串"9999999999999999999999"是一个有效的整数 (4认同)
  • 你会注意到这不会检查null.我们愿意抛出空指针异常.如果你想处理它,你可以.我选择不,而是委托它. (3认同)
  • 有人可以向我解释为什么第三种方法是不好的做法?因为基于异常执行流程? (2认同)
  • @iamcreasy一般来说我还是会说不.您的方法是以下两种方法之一:要么测试有效性,要么实际工作.如果它测试有效性,它应该找到一种方法来做到这一点,没有例外,因为有效性测试有时会期望无效输入.如果它是一个实际的工作方法,它应该只是冒出异常,除非你将异常包装在特定于框架的异常中. (2认同)
  • 另外,什么是“异常”?应该出卖多少确定性才能使情况“异常”?99%?90%?75%?从你打老板脸的例子来看,这很搞笑,你什么时候会说打电话给警察是合适的?当你用更大的声音说“我的盘子里有很多……”这句话时?声音大多少?术语“例外”或“预期”是如此主观,以至于不能用来描述何时使用某物。我认为我们应该认为它更简单。字符串是整数,前提是它可以是整数。我们怎么知道它是否可以是整数?尝试一下。 (2认同)

shu*_*why 236

使用正则表达式更好.

str.matches("-?\\d+");


-?     --> negative sign, could have none or one
\\d+   --> one or more digits
Run Code Online (Sandbox Code Playgroud)

NumberFormatException如果你可以使用它在这里使用是不好的if-statement.


如果你不想要前导零,你可以使用正则表达式如下:

str.matches("-?(0|[1-9]\\d*)");
Run Code Online (Sandbox Code Playgroud)

  • 另外......如果有人想处理信号'+',我就制作了那个版本(关于你的):`str.matches("^ [+ - ]?\\ d + $")` (15认同)
  • 好奇为什么这不是选择的答案...... (15认同)
  • @BrentHronik这是一个很好的干净的单行,但根据http://stackoverflow.com/questions/237159/whats-the-best-way-to-check-to-see-if-a-的答案之一string-represent-an-integer-in-java,它比corsiKa建议的方法慢10倍. (7认同)
  • 我投了反对票。原因:问题是检查给定的字符串是否为整数。该整数的位数有限制,范围为 -2147483648 到 2147483647。如果您在字符串中提供的字符多于限制,则正则表达式将通过它。 (2认同)

Wil*_*son 134

或者你可以在Apache Commons上向我们的好朋友寻求帮助:StringUtils.isNumeric(String str)

  • 我希望这对我来说是一个很好的答案,但不仅""返回true而且"-1"将返回false.这意味着它既不会为所有有效整数返回true,也不会返回true,保证将它传递给Integer.parseInt不会抛出异常. (12认同)
  • @jhericks感谢您指出这一点.几年前,当我第一次回答这个问题时,它引用了旧版本的Commons StringUtils.他们已经更新了api,因此空字符串现在被认为是非数字的.不幸的是,负面情况必须单独处理,这是一个缺点,但解决方法是微不足道的.在parseInt调用之后,只需检查numberCandidate.startsWith(" - ")和带有否定的子串调用,当然假定值是数字. (5认同)
  • `StringUtils.isNumeric(String)`不满足原始请求以检查字符串"是否为整数",而且还建议像apache commons这样的野兽以避免写一个单行是不合理的恕我直言. (3认同)
  • 我对这个方法的唯一问题是""返回true.我们的直觉告诉我们空字符串不是一个数字(OP问题的整数)你可以执行数学运算,但我想你可以说你不能证明空字符串是非数字的,因为我们没有告诉你但字符串将是什么. (2认同)

小智 69

或者干脆

mystring.matches("\\d+")

虽然对于大于int的数字它会返回true

  • @ njzk2使用`"^ - ?\\ d + $"`作为你的正则表达式 (14认同)
  • 不起作用.匹配一行中包含1个或更多数字的任何字符串.例如,`blabla.0 bla bla bla`匹配. (7认同)
  • 怎么样的值x与x> Integer.MaxValue,min相同? (2认同)

Mik*_*wis 53

您想使用Integer.parseInt(String)方法.

try{
  int num = Integer.parseInt(str);
  // is an integer!
} catch (NumberFormatException e) {
  // not an integer!
}
Run Code Online (Sandbox Code Playgroud)

  • @bobismijnnaam这个问题是,它产生了一个相对昂贵的异常,你有一些讨厌的嵌套,这可能会影响可读性. (10认同)
  • 例外表明出现了问题,这种使用肯定是滥用这种设计原则.只有在你确定**之后才使用Integer.parserInt()**,String确实包含一个整数值.如果这样做并且Integer.parseInt仍然抛出一个异常,那么你知道你的代码中有一个问题需要修复(或者,为了完整起见,Integer.parseInt本身就是错误的,但是这个选项不太可能) (4认同)
  • 为什么这不是更高的评价?这对我来说似乎是最简单的,还是我遗漏了一些缺点? (3认同)

Ste*_*n C 13

作为尝试解析字符串和捕获的替代方法NumberFormatException,您可以使用正则表达式; 例如

if (Pattern.compile("-?[0-9]+").matches(str)) {
    // its an integer
}
Run Code Online (Sandbox Code Playgroud)

这可能会更快,特别是如果您预编译和重用正则表达式.但是,Integer.parseInt(str)如果str代表一个超出合法int值范围的数字,那么问题仍将是失败.

  • `Integer.parseInt("000123");`将返回整数`123`而不抛出任何异常. (3认同)
  • @iluxa - 你错了.`000123`是一个有效的十进制整数 - 它与`123`相同.Integer.parseInt说:*"字符串中的字符必须都是十进制数字,除了第一个字符可能是ASCII减号' - '('\ u002D')以表示负值."*.(你用Java`int`*literals*混淆整数值.) (2认同)

Rus*_*aul 8

您可以按以下方式使用Integer.parseInt(str)并捕获NumberFormatExceptionif字符串是否为有效整数(如所有答案所指出的):

static boolean isInt(String s)
{
 try
  { int i = Integer.parseInt(s); return true; }

 catch(NumberFormatException er)
  { return false; }
}
Run Code Online (Sandbox Code Playgroud)

但是,请注意,如果计算的整数溢出,则将抛出相同的异常.你的目的是找出它是否是一个有效的整数.因此,使用自己的方法检查有效性会更安全:

static boolean isInt(String s)  // assuming integer is in decimal number system
{
 for(int a=0;a<s.length();a++)
 {
    if(a==0 && s.charAt(a) == '-') continue;
    if( !Character.isDigit(s.charAt(a)) ) return false;
 }
 return true;
}
Run Code Online (Sandbox Code Playgroud)