【问题标题】:Trying to determine if a string is an integer尝试确定字符串是否为整数
【发布时间】:2016-11-10 03:36:16
【问题描述】:

说明: 给定一个字符串,判断它是否为整数。例如 字符串“123”是整数,但字符串“hello”不是。

如果字符串中的所有字符都是数字,则为整数。

如果是整数则返回 true,否则返回 false。

提示:有一个方法 Character.isDigit() 将 char 作为参数 并返回一个布尔值。

到目前为止我所拥有的:

public boolean isInteger(String str) {
    if(Character.isDigit(str.charAt(0)) == 0) {
        return false;
    }
    for (int i = 0; i < str.length(); i++) {
        if(Character.isDigit(str.charAt(i))) {
            break;
        } else {
            return false;
        }
    }
    return true;
}

我在返回字符串“101”的布尔值时遇到问题,根本没有字符串(“”)

【问题讨论】:

  • if(Character.isDigit(str.charAt(0)) == 0) { return false; } 这种情况很奇怪。为什么要评估 booleanint
  • 另外,您应该删除break;,否定第一个条件,然后将return false; 放入其中。
  • 对于“if(Character.isDigit(str.charAt(0)) == 0) { return false; }”,如果没有放入细绳。此外,我尝试否定使我的“101”布尔字符串正确的第一个条件,但它最终使所有其他返回值都不正确。

标签: java string integer


【解决方案1】:

您可以使用正则表达式。

return str.matches("\\d+");

但不适用于负数。

您也可以使用Integer.parseInt 并捕获NumberFormatException 并相应地返回真/假。

或者,您不应该破坏找到的第一个数字,因为您需要检查所有字符,直到找到一个不是数字的字符。同样,这不会捕获负数

public boolean isInteger(String str) {
    if(str == null || str.trim().isEmpty()) {
        return false;
    }
    for (int i = 0; i < str.length(); i++) {
        if(!Character.isDigit(str.charAt(i))) {
            return false;
        } 
    }
    return true;
}

就个人而言,选项 2 是最好的,但您的说明似乎暗示您需要迭代字符值

【讨论】:

    【解决方案2】:

    只需检查 Integer.parseInt 是否抛出异常。

    try {
        Integer.parseInt(string);
    } catch (NumberFormatException e) {
        return false;
    }
    return true;
    

    【讨论】:

    • 我使用的程序是一个非常有限的编译器,目的是教人们如何在每章中使用特定的 Java 方法。它(可悲)不能使用 .parseInt 因为当前课程没有教它。
    【解决方案3】:

    您很接近,但逻辑混乱。我现在就和你一起经历。

    if(Character.isDigit(str.charAt(0)) == 0) {
        return false;
    }
    

    如果尝试测试,我不确定上述语句是什么。我看到您正在检查0 索引是否为数字,但随后您将其与0 进行比较。即使写得正确,也可以删除此语句,因为您将要遍历字符串。阅读您的评论后,它似乎是为了检查null 或空字符串。在这种情况下,您可能需要直接测试string

    if(str == null || str.isEmpty())
        return false;
    

    for (int i = 0; i < str.length(); i++) {
        if(Character.isDigit(str.charAt(i))) {
            break;
        }
         else {
            return false;
        }
    }
    return true;
    

    上面的break; 并没有像我认为的那样做。 break; 将退出for 循环,因此只检查第一个character。我建议重写此if-else 以摆脱else 并否定您的isDigit 方法。请参阅下面的代码。

    for(int i = 0;i < str.length();i++){
        if(!Character.isDigit(str.charAt(i))
            return false;
    }
    return true;
    

    如果character 不是数字,您只需要return false

    【讨论】:

    • 在检查逻辑中,应该处理连字符 - 用于负值(加 + 用于正值)
    • @kidnan1991 我不相信 OP 担心 +-。由于 OP 指向Character.isDigit() 的方向,+- 不是数字,因此如果输入将是 return false
    • 我明白你的意思。 OP 不关心符号(- 或 +0)。关于您的解决方案,如果前缀为空(OP 希望它为假),则它不正确。因此,首先,修剪字符串 => 在任何进程之前检查大小
    • @kidnan1991 我考虑修剪字符串,但我认为这并不重要。我可以在第一个 if 语句中添加另一部分,但如果 string 中只有一个空格,那么它不是数字,无论如何都会退出。
    【解决方案4】:

    上述所有解决方案对我来说似乎都是正确的,但我想为这个问题再提供一个解决方案。您也可以使用 ASCII 值来检查:

    private Boolean IsInteger(String str)
    {
       int length = str.length(),c=0;
       if(length==0)
          return false;
       for(int i=0;i<length; i++)
       {
          c = (int)str.charAt(i)-48;
          if(!(c>=0 && c<10))
             return false;
       }
      return true;
    }
    

    我认为我的解决方案要好得多,因为它每次迭代使用的库函数数量更少。

    我没有检查负值,因为在问题中您已指定如果所有字符都是数字,则字符串为整数。如果要检查负数,可以通过在 i==0; 中添加一个条件来完成。

    【讨论】:

    • 投票处理OP想要的空字符串
    【解决方案5】:

    我建议使用正则表达式来识别整数。

    像这样

    public boolean isInteger(String str){
      Pattern p = Pattern.compile("[0-9]+");
      Matcher m = p.matcher(str);
      boolean b = m.matches();
      return b;
    }
    

    【讨论】:

    • 所以...就str.matches("[0-9]+");?
    • 哈哈,是的,是一样的。我只是从 java API 示例中复制的
    【解决方案6】:

    在java中,你可以使用这个正则表达式模式: 它将过滤负值或正值

    private static final String NUMBER_REGEX = "(^\\d++)|(^[\\-]{1}\\d++)";
    private static final Pattern NUMBER_PATTERN = Pattern.compile(NUMBER_REGEX);
    final Matcher matcher = NUMBER_PATTERN.matcher(inputString);
    if(matcher.find()) {
    // If matcher => parse the value
    final String sNumber = matcher.group();
    final int value = Integer.parseInt(sNumber);
    } else {
    // Not matching
    }
    

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 2010-12-17
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 2014-11-05
      相关资源
      最近更新 更多