Как узнать, является ли первый символ строки числом?

108

В Java есть способ узнать, является ли первый символ строки числом?

Один из способов -

string.startsWith("1")

и проделайте то же самое до 9, но это кажется очень неэффективным.

Вездесущий
источник
10
Я собирался упомянуть способ регулярного выражения, но боялся, что если я это сделаю, у вас возникнет соблазн попробовать его.
Майкл Майерс

Ответы:

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)выкинет StringIndexOutOfBoundsException. startsWithнет этой проблемы.

Чтобы сделать все условие одной строкой и избежать проверки длины, вы можете изменить регулярные выражения на следующее:

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

Если условие не появляется в замкнутом цикле в вашей программе, небольшое снижение производительности при использовании регулярных выражений вряд ли будет заметным.

Майкл Майерс
источник
Re: «вы должны сначала убедиться, что строка не пуста» - истина и более того - вы также должны убедиться, что она не равна нулю, как если бы все отображаемые методы генерировали исключения. Вы можете либо напрямую проверить (например ((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 раз». Это означает то же самое, что и шаблон.
Анджей Дойл
Это решение не работает, так как String.matches и Pattern API пытается сопоставить полную строку, а не только первый символ
Амриш Пандей
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;
}

Наверное, излишество, но я стараюсь избегать регулярных выражений, когда могу.

Педро Х.Н. Виейра
источник