Double.Parse i exception

0

Witam. Piszę coś na wzór kopii kalkulatora Windows - po prostu uczę się C# no i mam drobny problem. Otóż:

screenshot-20161230202742.png

Jak widzimy w kalkulatorze Windows po wpisaniu liczby dajmy na to 55 555 jest ona formatowana przy pomocy spacji - chodzi mi o tą przerwe między liczbami np 1 324, 11 567 - okej ten efekt udało mi się osiągnąć bez problemu za pomocą formatowania ToString i operatora #

 private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (textBox1.Text != "")
            {
                if (przecinek == false)
                {
                    textBox1.Text = double.Parse(textBox1.Text).ToString("# ### ### ### ### ##0").Trim();
                }
            }
        }

Zależy mi aby liczba formatowana była w trakcie wpisywania dlatego jest to w evencie TextChanged. Tutaj wszystko gra. Jak wiemy kalkulator również posiada i negację.

Czyli tutaj również sprawa jest prosta, wystarczy zrobić takie cuś:

 textBox1.Text = (double.Parse(textBox1.Text) * -1).ToString().Trim();

I teraz dochodzę do sedna sprawy - po zrobieniu czegoś takiego efekt jest niezadowalający, a mianowicie po wpisaniu w textbox dajmy na to liczby 55555 jest ona formatowana na 55 555, po nacisnięciu negacji wykonywany jest wyżej wymieniony kod i wywala exception, próbowałem wszelakiej maści NumberStyles, NumberFormatInfo. Próbowałem nawet modyfikacji mojego ToString na takie coś:

textBox1.Text = double.Parse(textBox1.Text).ToString("# ### ### ### ### ##0;-# ### ### ### ### ##0").Trim();

Oczywiście wychodzi exception, ale o dziwo zrobienie czegoś takiego:

textBox1.Text = double.Parse(textBox1.Text).ToString("# ### ### ### ### ##0;-# ###").Trim();

Nie powoduje już błędu, więc zakładam że to całe formatowanie ma jakiś swój limit, natomiast efekt jest niezadowalający, po wpisaniu liczby 55555555 -> 55 555 555 i kliknięciu przycisku negacji wychodzi -55 555555, ponieważ dodanie dalszego formatowania powoduje wyjątek. Wiem że pewnie kombinuje jak koń pod górę ale męczę się z tym małym efektem już od dobrych 5 godzin i nie mam pomysłu jak to zrobić. Zależy mi na tym aby po zanegowaniu liczba była zanegowana i sformatowana.

Dodam jeszcze że w owym formatowaniu znak średnika jest oddzielnikiem grupy, formatowanie pierwsze jest dla liczb dodatnich, natomiast po średniku następuje formatowanie liczb ujemnych. Męczy mnie fakt, że nie da się tego formatowania zrobić do końca - operuje na double więc też chce mieć sformatowane 15 liczb, jednakże jest to niemozliwe używając mojej metody, napisałem już wyżej czemu.

Proszę niech ktoś rzuci okiem i zaproponuje jakieś lepsze rozwiązanie :)

Pozdrawiam, Dawid.

3

Zamiast pobierać każdorazowo string z textboxa i parsować go na double, trzymaj zawsze wartość jako zmienną double w polu klasy.
Wszystkie operacje dodawania odejmowania itp wykonuj na tej zmiennej a dopiero na końcu aktualizuj tekst w textboxie wyświetlając sformatowaną wartość tej zmiennej.

0

Tak to jest dobry pomysł, jednakże głównie kwestia para się tego przeklętego minusa - dajmy na to że miałbym w zmiennej wartość powiedzmy -32500, zależałoby mi na tym aby wyświetlić to jako -32 500 - jakim formatowaniem mogę taki efekt osiągnąć? Sposób o którym pisałem w swoim poście nie bardzo się tego trzyma, a jak podkreślam operuję na double więc formatowanie ma się tyczyć dajmy na to tych 15 liczb - dwa warianty dodatnie i ujemne. Od biedy mógłbym po prostu jakimś forem sprawdzać najpierw długość tam tekstu i manualnie pododawać spację, ale czy istnieje jakiś inny sposób by to zrobić?

Zwykłe formatowanie chwyta bez problemu, po dodaniu minusa robi się farsa i wywala błędy.

0

Wcześniej zanegowaną wartość robiłem do zmiennej typu double następnie przemnażałem przez -1 i wyświetlałem do textboxa - ten sposób był dobry, dopóki nie wymyśliłem sobie tego formatowania. Z formatowaniem nagle okazuje się że są problemy.

Wybaczcie za post pod postem, wypadałoby założyć konto, aby móc edytować posty :)

0

Wydaje mi się że twoim problemem nie jest formatowanie, bo to powinno działać ToString("# ### ### ### ### ##0;-# ### ### ### ### ##0").Trim();
ale to że parser nie radzi sobie ze spacjami w stringu.

0

No rzeczywiście tutaj masz rację, zauważyłem że dzieją się dziwactwa typu: (- 32 500) i wtedy pojawia się błąd. Masz może jakąś sugestię jak to rozwiązać?

1

Napisałem przecież, nie parsuj tekstu z textboxa tylko trzymaj wartość w zmiennej double na przykład jako pole klasy.

0

Dobra, dzięki. Rzeczywiście ten parser był problemem w całej operacji:

screenshot-20161230230753.png

 double xyz = double.Parse(textBox1.Text) * -1;
            textBox1.Text = xyz.ToString("# ### ### ### ### ##0;-# ### ### ### ### ##0").Trim();

Coś takiego działa jak najbardziej okej, natomiast znowu muszę się pozbyć tych ekstra spacji po minusie, nie wiem skąd one się biorą.

0

Pokaż cały kod, bo widzę że dalej nie rozumiesz po co ci ta dodatkowa zmienna.

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