ograniczenie input tylko do liczb

0

witam,

mam nastepujacy problem, napisalem prosty program gdzie uzytkownik wpisuje kilka cyfr i program liczy srednia. wszystko dziala ok jesli wpisze sie liczby, ale nie jesli zostanie wpisany jakikolwiek inny znak. czy moglby ktos podsunac mi kod jak sprawdzic czy input to cyfra, lub napisac kod ograniczajacy input tylko do cyfr?

z gory dzieki,
pozdrawiam
Piotrek

0

udalo mi sie znalezc cos takiego:
http://www.javadb.com/using-bufferedreader-to-read-input-number-from-user
ale to nie do konca rozwiazuje moj problem...

pozdrawiam

0

Mozesz obudowac strumien wejsciowy System.in w java.util.Scanner i uzyc jednej z dostepnych w tej klasie metod (np. nextInt()), przechwycajac wyjatek InputMismatchException w przypadku blednych danych. Ew. w J2SE 6 lepszym bedzie uzycie klasy java.io.Console. W tym przypadku, odczytana linie (metoda readLine()) trzeba sparsowac do wartosci liczbowej (podobnie jak w przykladzie, ktory podales) i rowniez przechwycic odpowiedni wyjatek. Jesli wyjatek nie wystapi, bedzie to oznaczac, ze wprowadzono wlasciwa wartosc.

0

albo bardziej eleganckie rozwiązanie: użyć klasy Matcher i Pattern

0

http://4programmers.net/Java/FAQ/Jak_umo%C5%BCliwi%C4%87_wpisywanie_tylko_cyfr_w_komponenty

Plus poszukaj, bo było na forum wałkowane i to kilka razy.

0

@LukaStrz, rozwiązanie z Matcher i Pattern jest może eleganckie, na pewno jest kiepskie. Trudno się np. sprawdza czy wprowadzony ciąg cyfr jest liczbą typu int.

0

Metoda, ktora podal Koziołek jest krokiem we wlasciwa strone. Jak sie uzytkownikowi nie da mozliwosci wprowadzania glupot, to nie bedzie go kusilo. Co do samego rozwiazania, tj. nasluchiwanie przy pomocy interfejsu KeyListener, to nie sprawdzi sie ona w przypadku wklejania tekstu skrotem Ctrl+C/Ctrl+V. Lepszym sposobem jest stworzenie wlasnego "kontrolera" dokumentu bazujacego na PlainDocument:

class JDigitField extends JTextField {
    public JDigitField() {
        setDocument(new DigitDocument());
    }

    private class DigitDocument extends PlainDocument {
        public void insertString(int offs, String str, AttributeSet a)
            throws BadLocationException {
            // przefiltrowanie lancucha wejsiowego "str"
            for(char c : str.toCharArray) {
                if(!Character.isDigit()) {
                    return;
                }
                super.insertString(offs, str, a);
            }
        }
    }
}

Problem w tym, ze parsowanie liczb rzeczywistych, dodatkowo ze znakiem, moze znacznie skomplikowac kod.

Wyrazenia regularne nie bylyby takim zlym pomyslem. Liczby rzeczywiste mozna sprawdzic np. w ten sposob:

String s = "-.5";
Pattern pattern = Pattern.compile("^[-+]?((\\d*[.]?\\d+)|(\\d+[.]?\\d*))");
Matcher matcher = pattern.matcher(s);
if(matcher.matches()) {
    float value = Float.parseFloat(s);
}

Podane wyrazenie pozwala wprowadzic liczby z/bez znaku oraz pominac liczbe zarowno przed jak i po kropce dziesietnej. To rozwiazanie nie ma zastosowania do notacji wykladniczej.

0

Pomysły z KeyListenerem, filtrowaniem itp. są zapewne zupełnie nieprzydatne autorowi wątku - jemu chodzi o wpisywanie liczb na konsoli. Ja w programie z GUI preferuje inne rozwiązanie - pozwalam użytkownikowi wpisać (wkleić) co mu się żywnie podoba. Natomiast przez podpięcie FocusListenera nie pozwalam zdjąć fokusu z pola tekstowego z niewłaściwą zawartością. Niewłaściwa oznacza jedną z dwóch rzeczy: nie da się sparsować, da się sparsować ale wartość otrzymanej liczby jest poza dopuszczalnym zakresem. Dodatkowo pole tekstowe jest wyposażone w filter, który zmienia kolor obwódki gdy zawartość jest nieprawdłowa.
Użycie w programie jest trywialnie proste

    add(new JInputInteger(1,Integer.MAX_VALUE,"100000"));
    add(new JInputDouble(-1.0d,1.0d,"0.25"));

user imageuser image

1 użytkowników online, w tym zalogowanych: 0, gości: 1