如何确定字符串的第一个字符是否为数字?


108

在Java中,有没有一种方法可以确定字符串的第一个字符是否为数字?

一种方法是

string.startsWith("1")

并一直执行到9点,但这似乎效率很低。


10
我本想提一下正则表达式的方式,但是我担心如果这样做,您会很想尝试它。
迈克尔·迈尔斯

Answers:


259
Character.isDigit(string.charAt(0))

请注意,这将允许使用任何 Unicode数字,而不仅仅是0-9。您可能更喜欢:

char c = string.charAt(0);
isDigit = (c >= '0' && c <= '9');

或较慢的正则表达式解决方案:

s.substring(0, 1).matches("\\d")
// or the equivalent
s.substring(0, 1).matches("[0-9]")

但是,使用这些方法中的任何一种,必须首先确保该字符串不为空。如果是,charAt(0)而且substring(0, 1)将引发StringIndexOutOfBoundsExceptionstartsWith没有这个问题。

要使整个条件只占一行,并避免长度检查,可以将正则表达式更改为以下内容:

s.matches("\\d.*")
// or the equivalent
s.matches("[0-9].*")

如果条件没有出现在程序的紧密循环中,则使用正则表达式对性能的影响很小。


回复:“您必须首先确保字符串不为空”-是,更重要的是,还必须确保其不为null,就好像所有显示的方法都将引发异常。您可以直接检查(例如((null!=s) && Character.isDigit(s.charAt(0)) ))或使用类似的技巧Character.isDigit((s?s:"X").charAt(0))
epeleg

8

正则表达式是非常强大但昂贵的工具。使用它们来检查第一个字符是否为数字是有效的,但是它不是那么优雅:)我更喜欢这种方式:

public boolean isLeadingDigit(final String value){
    final char c = value.charAt(0);
    return (c >= '0' && c <= '9');
}

12
1)function不是Java。2)这仅允许使用阿拉伯数字,而不允许中文,印度等。这可能是您喜欢的,但未在问题中指定。3)四年前,我已经在我的回答中介绍了这个确切的解决方案。
迈克尔·迈尔斯

0
regular expression starts with number->'^[0-9]' 
Pattern pattern = Pattern.compile('^[0-9]');
 Matcher matcher = pattern.matcher(String);

if(matcher.find()){

System.out.println("true");
}

2
您不需要{1,1}后缀,这意味着“前面的模式必须出现1到1次”。这意味着与模式本身完全相同。
Andrzej Doyle

由于String.matches和Pattern API尝试匹配完整的字符串,而不仅仅是第一个字符,因此该解决方案不起作用
Amrish Pandey 2015年

0

我只是碰到了这个问题,并考虑过提供一个不使用正则表达式的解决方案。

就我而言,我使用辅助方法:

public boolean notNumber(String input){
    boolean notNumber = false;
    try {
        // must not start with a number
        @SuppressWarnings("unused")
        double checker = Double.valueOf(input.substring(0,1));
    }
    catch (Exception e) {
        notNumber = true;           
    }
    return notNumber;
}

可能是一个过大的杀伤力,但我会尽量避免使用正则表达式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.