[C#] Wczytywanie danych z textboxa


(Jarek P) #1

Witam,

piszę sobie prosty kalkulator i natrafiłem na pewien problem, a mianowicie:

Wczytuję liczbę całkowitą z textboxa w ten sposób:

double qa = double.Parse(a.Text);

Wszystko jest w porządku, dopóki ktoś nie postawi kropki zamiast przecinka.

Jak można temu zaradzić? Z góry dziękuję za pomoc.


(system) #2

choćby tak:

double qa;

try{

     qa = double.Parse(a.Text);

}

catch(Exception)

{

     MessageBox.Show("Motyla noga...");

}

albo

if (Double.TryParse(a.Text, out number))

     qa = number;

else

     MessageBox.Show("Motyla noga...");

(Grzelix) #3

Ewentualnie możesz założyć że kropka też jest ok i zrobić tak:

if (Double.TryParse(a.Text.Replace(".",","), out number))

     qa = number;

else

     MessageBox.Show("Motyla noga...");

(B.Andy) #4

Lepiej zamieniać przecinek na kropkę, dzięki czemu na wszystkich wersjach językowych zadziała:

double liczba = Double.Parse(textbox.Text.Replace(",", "."), CultureInfo.InvariantCulture);

(system) #5

Tylko ten przypadek nie sprawdza czy użytkownik nie wpisał przypadkiem na przykład litery.


(Grzelix) #6

Mi do głowy jeszcze przyszedł jeden pomysł. Dodać event na onchange dla textboxa który będzie walidował w czasie rzeczywistym wprowadzane dane.

Tak jak wspomniał @Pepek1989 nie sprawdzania czy nie została podana litera, ale także inne opcje należało by uwzględnić - znaki specjalne czy przecinek na początku wyrażenia.

Tak więc event na onchange i powiadamianie użytkownika końcowego o próbie użycia niedozwolonego znaku.


(somekind) #7

Nauczyć użytkownika pisać. :wink:

Możesz zrobić tak, jak napisał @Pepek1989 - użyj double.TryParse, jeśli zwróci false, to wyświetl użytkownikowi komunikat, że dane są niepoprawne i poproś o wpisanie liczby.

Możesz też użyć innej (lepszej być może) kontrolki, np. MaskedTextBox, któremu możesz zdefiniować format tekstu do wprowadzenia albo NumericUpDown, które jest dedykowane do wygodnego wprowadzania liczb.

Bzdura, zadziała raptem na kilku. W USA (i wielu innych krajach) kropka jest separatorem dziesiętnym, przecinek jest separatorem tysięcy. W Hiszpanii (i wielu innych krajach) znaczenia tych znaków są zupełnie odwrotne. Jaki będzie efekt działania tego kodu w obu tych przypadkach?

Tak, oczywiście najlepszym sposobem na walidację wpisanych przez użytkownika danych jest zabronienie mu wpisywania czegokolwiek. :smiley:


([alex]) #8

Niewykonalne :stuck_out_tongue_winking_eye:


(somekind) #9

Skoro ćwiczenie polega na odczytaniu liczb z textboxa, to jak zakazanie wpisywania do niego ma być rozwiązaniem?

To jest już nieco rozsądniejsze.

E tam, parę lat z kijem albo batem. :wink:


(system) #10

Ewentualnie robimy tak:

int isNumber = 0;

e.Handled = !int.TryParse(e.KeyChar.ToString(), out isNumber);

Dzięki temu fragmentowi kodu pod akcją KeyPress Użyszkodnik wpisze wyłącznie cyfry do pola TextBox. Inne znaki się nie pojawią. Sprawdź :wink:


(Grzelix) #11

@Pepek1989 Ostatnia twoja porada z punktu widzenia programistycznego jest ok, ale z punktu użyteczności (usability - dość interesujący temat dla osób tworzących oprogramowanie) jest bardzo zły. Otóż dlaczego. W momencie kiedy użytkownik zacznie używać innych znaków to program będzie w jego odczuciu martwy. W takich sytuacjach zawsze powinno się podać informację zwrotną dlaczego coś zabroniliśmy.

Także do powyższego kodu należy dodać jeszcze jakąś informację zwrotną dla użytkownika. Tutaj też należy pamiętać że taka informacja powinna być zwięzła i adekwatna. Jeśli będzie to np MessageBox z 3 linijkami tekstu co się wydarzyło, użytkownik będzie klikał ok bez czytania. Sami dobrze o tym wiemy.

Btw, ja zaczekałbym na jakiś feedback od autora tematu czy rozwiązał swój problem. Czy wybrał coś z naszych porad, czy może jakaś konkretna specyfikacja jego programu nie pozwala mu użyć niektórych z zasugerowanych rozwiązań.


(somekind) #12

No, tylko czemu nie zrobić po prostu tak?

e.Handled = char.IsDigit(e.KeyChar);

Czyli liczby nie będzie mógł wpisać.


(system) #13

(kostek135) #14

(system) #15

Jaki spór kostek135 , zwyczajnie myślałem o liczbach całkowitych, bo autor pisał o textboksie z którego chce wyciągnąć od użyszkodnika liczbę całkowitą. Czekamy co autor powie


(kostek135) #16

Pierwszy post w całym wątku.

double w obrębie znacznika code, kropka, przecinek. Naprawdę chodzi mu o liczbę całkowitą? Myślę, że to przejęzyczenie i oczywiście chodzi o zmiennoprzecinkową. W każdym razie więcej przesłanek jest za kalkulatorem zmiennopozycyjnym.

PS Przez "spór" miałem namyśli to o co @somekind prawdopodobnie się doczepił. Twój kod nie pozwoli wpisać liczby np 5,2.


(system) #17

Fakt. Mój błąd.