Як дізнатись, чи є перший символ рядка числом?


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 намагаються відповідати повному рядку, а не лише першому символу
Amrish Pandey

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;
}

Можливо, зайвий набір, але я намагаюся уникати регулярних виразів, коли можу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.