Zabezpieczenie przed liczbami binarnymi

0

Jakiej metody w c# trzeba użyć, że żeby zabezpieczyć się w textBoxie przed wpisywaniem liczb binarnych lub innych? Tzn. jeśli wybieram opcję binarną, to bład ma wyskakiwać gdy wiszę liczbę dec i tak dalej.

Chodzi oczywiście o program w windows forms.

4

101?, jaka to liczba? binarna, ósemkowa, dziesiętna, szesnastkowa?

0

Prawdę mówiąc nie wiem co odpowiedzieć, żeby mnie o brak pokory ktoś nie posądził? Może zastanów się czy zrozumiałeś moje pytanie, bo jak dla mnie twoja odpowiedź jest trochę od czapy.

Do rozwiązania mojego problemu prawdopodobnie potrzebne są jakieś metody, metody, których nie znam i których nie mogę się na msdn doszukać. Nie sądziłem jednak, że będzie tu osoba, która zada mi pytanie: co to jest 101?

0

101 jest liczbą dec, czy ma wyskoczyć błąd gdy wybrano opcję bin?

0

@finito bo nadałeś temu wątkowi idiotyczny tytuł. Bo zabezpieczyć się "przed liczbami binarnymi" to nie dasz rady, o czym napisał @bogdans
Bo nie trudno wykryć że ktoś wpisał coś spoza zakresu [0-9] a miał wpisać liczby dec, albo wpisał coś spoza [0-1] kiedy miał podać liczbę binarną. Ale jak ktoś ma wpisać liczbę dec czy hex a wpisze "binarną" to nie wiem jak niby chciałbyś się zabezpieczyć. Bo bo jak rozpoznasz czy 101 wpisane przez użytkownika to jest (w jego mniemaniu) liczba bin, dec czy hex?

1

hmm

http://stackoverflow.com/questions/9149728/convert-binary-string-into-integer

Jak poleci wyjątek, to go łapiesz i juz wiesz, że liczba ma niepoprawny format.

0

Dobra, to może dokładniej wyjaśnię o co mi chodzi, bo tytuł dałem faktycznie fatalny.
No więc mam combobox, w którym wybieram 'sysem_binarny'. Niżej mam text box, w którym wpisuję liczbę niebinarną (np 28374). Teraz Klikam konvertuj i w tej chwili program ma się zatrzymać na komunikacie "głupku, niewpisałeś liczby binarnej tylko jaką inną".

I teraz mój problem polega na tym, że nie wiem jak napisać metodę, która ma to sprawdzać i wysyłać odpowiednie komunikaty. Same komunikaty, to malutkie piwo. Mam natomiast trudność z zaprojektowaniem kodu sprawdzającego czy wpisywana liczba jest binarna czy jaka.

O to właśnie chodzi.


Tak na prawdę wystarczy mi jakaś podpowiedź...nie wiem...jakaś metoda, której nie znam. Bo przeleciałem wszystko w math oraz wszystko w numerical type. Nie znalazłem w tych działach tego, o co mi chodzi.

I tak w ogóle to szukam czegoś w rodzaju: isHex, isBinary lub isOctal.

0

Podałem Ci wyżej przykład, musisz w evencie keypress sprawdzać znak wpisany przez usera.
Albo w momencie przyciśnięcia konwertuj pobierasz zawartość textboxa i musisz sam przemielić ten string sprawdzając czy nie ma tam niedozwolonych znaków.
Albo lecisz tak jak @misiakufal podaje.

0

To C# jest taki upośledzony, że do funkcji parsującej nie można podać podstawy?

0
dam1an napisał(a):

W evencie KeyPressed, podobnie jak tu http://stackoverflow.com/questions/8590501/restricting-users-to-input-only-numbers-in-c-sharp-windows-application ale to jest dla wszystkich cyfr.

Okej, słuchajcie zadziałało mi. Hura;-) Ale nie rozumiem jednego: dlaczego nie mogę zobaczyć cyfer 01?
To jest kod:

private void wpisz_liczbe_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), "^[0-1]"))
            {
                e.Handled = true;
                komunikat.Text = "To jest liczba binarna";
            }
            else
            {
                e.Handled = false;
                komunikat.Text = "To nie jest liczba binarna";
            }
        }
 
2

RegEx Aby sprawdzić czy znak jest z zakresu '0'..'1', doprawdy?
Wystarczy:

if(e.KeyChar=='0' || e.KeyChar=='1')

Ale ani to co podałeś ani po tej poprawce jednak to nie działą, wpisz: 991 w notatniku zaznacz, skopiuj i wklej w pole.

0

Ale to nie zmienia tego, że i tak ten problem muszę rozwiązać inaczej. Funkcja badająca liczby musi zwracać wartość logiczną i raczej chyba nie może skakać po stringach, bo 10 może być dziesiętną a może być też binarną. Regexem tego nie sprawdzisz. Wydaje mi się, że stringa trzeba przekonwertować na liczbę i dopiero na tej liczbie działać, ale jak? No właśnie nie wiem, choć siedzę nad tym dzisiaj cały durny dzień.

0

No to przekaż do niej napis i sprawdź każdy znak na zakres.

0
            //wpuszczasz tylko binarne
            if (!(e.KeyChar == '0' || e.KeyChar == '1'))
            {
                e.Handled = true;
            }
            //tu przejdą tylko hexy
            int asci = (int)e.KeyChar.ToString().ToUpper()[0];
            if (!((asci>=65 && asci<=70) || asci >= 48 && asci <= 57))
            {
                e.Handled = true;
            }
            //tu tylko dziesiętnę
            if(!(asci >= 48 && asci <= 57))
            {
                e.Handled = true;
            }

Dodatkowo property ShortcutEnabled = false to nie pozwoli nic wklejać.

1

@dam1an, mogę zrozumieć pewne komplikacje kodu, które powodują zmniejszenie ilościowe tegoż kodu, ale to co podałeś ...

            e.Handled=!(('A'<=e.KeyChar && e.KeyChar<='F')||('a'<=e.KeyChar && e.KeyChar<='f')||('0'<=e.KeyChar && e.KeyChar<='9')); //tu przejdą tylko hexy
            e.Handled=!('0'<=e.KeyChar && e.KeyChar<='9'); //tu tylko dziesiętnę

Ewentualnie jeżeli założymy że w pewnym combo mamy wpisany system od 2 do 16 to:

e.Handled=("0123456789ABCDEF".IndexOf(e.KeyChar.ToString().ToUpper())<=Sytem.ItemIndex+1);

Z tym że poczytaj uważnie wątek, to nie ratuje pytającego, podpowiedź : <Ctrl-V>

0

Sory wielkie, nie napisałem, że to nie chodzi tylko o wymyślenie metody, która sprawdza czy wpisany jest bin czy dec. Ta metoda ma też sprawdzać czy wpisałem oktal lub hex. Jeśli w combo wybrałem dec, to po kliknięciu konwertuj, ma wyskoczyć stosowany komunikat. Ale to jest zupełnie bez sensu, bo jeśli wybiorę w combo "dziesietne", to skąd komputer ma wiedzieć, żę w polu textbox wpisałem akurat właśnie liczbę dziesiętną? Ktoś na początku tego wątku zapytał o tę liczbę 101 i chyba miał rację.

1

Brawo? Może i brawo, ale sęk w tym, że wykładowca właśnie zadał stworzenie w projekcie takiej metody. Chyba, że go źle zrozumiałem. Chodzi po prostu o to, by napisać metodę, która przed konwersją sprawdzi, czy w liczbie nie ma znaków należących do innego systemu. Po 24h mam zwyczajnie dość.

static void Main(string[] args)
        {

            ShowAsDec("ffff", 16);
            ShowAsDec("1101",2);
            ShowAsDec("1256", 8);
            ShowAsDec("1234", 2);
            
            Console.ReadKey();
        }

        static void ShowAsDec(string str, int b)
        {
            try
            {
                Console.WriteLine(Convert.ToInt32(str, b));
            }
            catch (Exception)
            {
                Console.WriteLine("Error");
            }
        }
0

Dam1an, zrobiłem według twoich wskazówek, ale wyskakuje mi taki error: Cannot implicitly convert type 'int' to 'string'; Na wstępie podkreśle, że robie to wszystko w windows forms - to nie jest program consolowy.Ponadto metoda musi być typu bool.

1.Pole textBox ma nazwę "wpisz_liczbe";
2.ComboBox ma nazwę "lewa_podstawa" - już mniejsza o to, dlaczego lewa.

private bool Czy(string lewa,int lewa_podstawa)
        {
           
            try
            {
                lewa = Convert.ToInt32(wpisz_liczbe.Text,lewa_podstawa);
            }
            catch(Exception)
            {
                komunikat.Text = "Wpisałeś nie prawidłowe znaki";
            }
            return true;
         }

Nie wiem jak się pozbyć tego erroru dotyczącego konwersji. Mam wrażenie, że napisałem coś nie logicznego, ale nie wiem co.

0

Słuchajcie, dzięki wielkie za wszelkie podpowiedzi. To z czym miałem problem już działa. Jeszcze raz dzienx;-)

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