如何检查一个字符串是否为数字?

44

我有一个GPA程序,它使用equalsIgnoreCase()方法比较两个字符串,字母"a"与用户输入进行比较,检查他们是否输入了"a"。但现在我想添加一个错误消息的异常处理机制,以便当用户输入数字时执行。我希望程序能够意识到整数输入与字符串不同并显示错误消息。我可以使用哪些方法来将类型为String的变量与int类型的输入进行比较,并抛出异常?


7
也许是 Pattern.compile("[0-9]+").matches(string) 吗? - Louis Wasserman
那么你想匹配“仅仅”整数还是任何数字? - arshajii
我不希望他们输入任何数字,只允许字符串。 - user1944277
11个回答

67

2
我会将最后一个“+”更改为“*”,这样123.就成为有效输入(小数分隔符后面没有任何内容是有效输入)。 - peterh
3
我会加入一个检查 NULL 的步骤……否则会导致崩溃。 - Stefan Michev
@StefanMichev 人们应该停止传递空参数。全世界的每个方法都进行空、空字符串或其他检查是不正确的。 - Buffalo
这是简单的代码,但数百万Java程序员都必须编写它。它应该在标准库中。 - Yetti99

34

4
不需要第三方任何东西:循环:如果(Character.isDigit(c)) - Roger F. Gay
6
注意!isNumeric和isDigits只处理纯数字,即对于包含逗号的数字7,574,它们将返回false。 - Kashif Nazar
1
isNumber(str:String) 已被弃用 - Federico Traiman

8

使用这个

public static boolean isNum(String strNum) {
    boolean ret = true;
    try {

        Double.parseDouble(strNum);

    }catch (NumberFormatException e) {
        ret = false;
    }
    return ret;
}

2
尝试捕获其他异常 :) 如果您发送了一个“Null”对象字符串,这将失败。 - prime

6

简单方法:

public boolean isBlank(String value) {
    return (value == null || value.equals("") || value.equals("null") || value.trim().equals(""));
}


public boolean isOnlyNumber(String value) {
    boolean ret = false;
    if (!isBlank(value)) {
        ret = value.matches("^[0-9]+$");
    }
    return ret;
}

6

我没有给你投反对票,但是你不需要添加更多的软件。在Java SE中:循环:如果(Character.isDigit(c)) - Roger F. Gay
2
注意!isNumeric仅处理纯数字。例如,对于7,574(逗号分隔的数字),它将返回false。 - Kashif Nazar
为什么对于问号它会返回true呢?https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isNumeric(java.lang.CharSequence) - pete

5
请使用以下方法:
public static boolean isNumeric(String str)  
{  
  try  
  {  
    double d = Double.parseDouble(str);  
  }  
  catch(NumberFormatException nfe)  
  {  
    return false;  
  }  
  return true;  
}

如果你想使用正则表达式,可以按照以下方式进行:

public static boolean isNumeric(String str)
{
  return str.matches("-?\\d+(\\.\\d+)?");  //match a number with optional '-' and decimal.
}

1
尝试捕获异常的开销非常大。 - WorldSEnder
编写异常代码是一种已知的反模式。请参阅 https://en.wikipedia.org/wiki/Coding_by_exception 和 https://softwareengineering.stackexchange.com/questions/189222/are-exceptions-as-control-flow-considered-a-serious-antipattern-if-so-why。 - mcalmeida
使用 Double.parseDouble() 方法在国际化编程环境中并不可行。它在美国可能运行得相当好,但在其他国家具有有效双精度的数字字符串不一定能正确解析。例如,在某些地区,千位分隔符可以是空格 " ",而 "123 456" 将导致 NumberFormatException 错误,尽管它是一个可解析的数字。 - Kenny Wyland

3
public static boolean isNumeric(String string) {
    if (string == null || string.isEmpty()) {
        return false;
    }
    int i = 0;
    int stringLength = string.length();
    if (string.charAt(0) == '-') {
        if (stringLength > 1) {
            i++;
        } else {
            return false;
        }
    }
    if (!Character.isDigit(string.charAt(i))
            || !Character.isDigit(string.charAt(stringLength - 1))) {
        return false;
    }
    i++;
    stringLength--;
    if (i >= stringLength) {
        return true;
    }
    for (; i < stringLength; i++) {
        if (!Character.isDigit(string.charAt(i))
                && string.charAt(i) != '.') {
            return false;
        }
    }
    return true;
}

2
我在程序中最后编写了这个小方法,以便检查一个字符串是否为数字,或者至少每个字符都是数字。
private boolean isNumber(String text){
    if(text != null || !text.equals("")) {
        char[] characters = text.toCharArray();
        for (int i = 0; i < text.length(); i++) {
            if (characters[i] < 48 || characters[i] > 57)
                return false;
        }
    }
    return true;
}

1
你可以使用Character.isDigit(char ch)方法,或者你也可以使用正则表达式。
下面是代码片段:
public class CheckDigit {

private static Scanner input;

public static void main(String[] args) {

    System.out.print("Enter a String:");
    input = new Scanner(System.in);
    String str = input.nextLine();

    if (CheckString(str)) {
        System.out.println(str + " is numeric");
    } else {
        System.out.println(str +" is not numeric");
    }
}

public static boolean CheckString(String str) {
    for (char c : str.toCharArray()) {
        if (!Character.isDigit(c))
            return false;
    }
    return true;
}

}


0

以下是如何检查输入是否包含数字的方法:

if (input.matches(".*\\d.*")) {
    // there's a digit somewhere in the input string 
}

嘿,谢谢,这很有帮助,但是即使抛出异常,我的程序仍然终止。如果我去掉异常,它就可以完美运行...就像我要求的那样,即使有数字也可以。你有什么想法,在我抛出异常后如何仍然保持程序运行? - user1944277
将抛出异常的代码放在try-catch块中,捕获抛出的异常。 - Bohemian
我已经尝试过将提示输入的代码部分用try catch包裹起来,但没有成功,您能否使用我上面发布的代码进行澄清? - user1944277
什么代码发布在哪里?我看不到任何代码。 - Bohemian

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