Czy w Javie istnieje sposób sprawdzenia, czy pierwszy znak ciągu jest liczbą?
Jeden sposób
string.startsWith("1")
i wykonuj powyższe czynności aż do 9, ale wydaje się to bardzo nieefektywne.
Czy w Javie istnieje sposób sprawdzenia, czy pierwszy znak ciągu jest liczbą?
Jeden sposób
string.startsWith("1")
i wykonuj powyższe czynności aż do 9, ale wydaje się to bardzo nieefektywne.
Odpowiedzi:
Character.isDigit(string.charAt(0))
Zauważ, że pozwoli to na dowolną cyfrę Unicode , nie tylko 0-9. Może wolisz:
char c = string.charAt(0);
isDigit = (c >= '0' && c <= '9');
Lub wolniejsze rozwiązania regex:
s.substring(0, 1).matches("\\d")
// or the equivalent
s.substring(0, 1).matches("[0-9]")
Jednak w przypadku każdej z tych metod należy najpierw upewnić się, że ciąg nie jest pusty. Jeśli tak, charAt(0)i substring(0, 1)wyrzuci StringIndexOutOfBoundsException. startsWithnie ma tego problemu.
Aby uczynić cały warunek jedną linią i uniknąć sprawdzania długości, możesz zmienić wyrażenia regularne na następujące:
s.matches("\\d.*")
// or the equivalent
s.matches("[0-9].*")
Jeśli warunek nie pojawia się w ciasnej pętli w twoim programie, niewielki spadek wydajności związany z użyciem wyrażeń regularnych prawdopodobnie nie będzie zauważalny.
((null!=s) && Character.isDigit(s.charAt(0)) )) Lub użyć sztuczek, takich jakCharacter.isDigit((s?s:"X").charAt(0))
Wyrażenia regularne to bardzo mocne, ale drogie narzędzie. Można ich używać do sprawdzenia, czy pierwszy znak jest cyfrą, ale nie jest tak elegancki :) Wolę ten sposób:
public boolean isLeadingDigit(final String value){
final char c = value.charAt(0);
return (c >= '0' && c <= '9');
}
functionto nie Java. 2) Dopuszczalne są tylko cyfry arabskie, a nie chińskie, indyjskie itp. To może być to, co wolisz, ale nie jest to określone w pytaniu. 3) Dokładnie to rozwiązanie opisałem już cztery lata temu w mojej odpowiedzi.
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");
}
{1,1}sufiksu, co oznacza, że „poprzedni wzorzec musi pojawić się od 1 do 1 razy”. Oznacza to dokładnie to samo, co sam wzór.
Właśnie natknąłem się na to pytanie i pomyślałem o współtworzeniu rozwiązania, które nie używa wyrażenia regularnego.
W moim przypadku używam metody pomocniczej:
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;
}
Prawdopodobnie przesada, ale staram się unikać wyrażeń regularnych, kiedy tylko mogę.