(Visual C++) Działania na label

0

Jak wykonać działanie jeżeli liczby podawane w label'ach są z przecinkiem?

Button:

label1->Text = (Double::Parse(textBox1->Text)*Double::Parse(textBox2->Text)).ToString();

Czy jest także możliwość dopisania do tego na końcu wyniku stałej informacji np. PLN?

1
  1. String^ tmp = "12,3"; tmp = tmp->Replace(",", ".");
  2. Konkatenacja.
0
  1. Jak to wykorzystać w powyższym przykładzie?
  2. Jeszcze tego nie przerabiałem ale dzięki za pomoc! :)
1
label1->Text = (Double::Parse(textBox1->Text->Replace(",", "."))*Double::Parse(textBox2->Text->Replace(",", "."))).ToString()+" PLN";
0

Nie chce przejść przez kompilator a "PLN" dodaje się na sam początek wyniku.

0

Lol, no to sprawdzasz jakie byki dostajesz i próbujesz je naprawić. Tutaj problemem pewnie są średniki wewnątrz instrukcji.

0

W dalszym ciągu nie przyjmuje liczb z przecinkiem.
Wyświetla się komunikat

An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll

Additional information: Nieprawidłowy format ciągu wejściowego.

Na puste pola wykorzystać Single::TryParse?

0

Jaki niby jest problem z przecinkiem?
Double::Parse() powinno prawidłowo rozpoznać liczbę z przecinkiem, nie należy nic z tym robić.

W dalszym ciągu nie przyjmuje liczb z przecinkiem.
Nieprawidłowe ustawienia regionalne w systemie?

1

user image

1

Albo należy wpisywać zgodnie z tym co masz ustawionego w systemie albo zamienić kropkę oraz przecinek na:
System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
a potem dopiero konwertować.

0

Niestety chyba dam sobie spokój z kropką. Ważne, że już działa a mi pozostaje tylko dalsza nauka z C++ bo nie ukrywam, że ledwo znam podstawy.
Dzięki jeszcze raz za pomoc! ;)

EDIT:
W poprzednim projekcie kalkulatora działającym na prawie takiej zasadzie tylko, że były dodane RadioButton'y klikając przykładowo na button "Oblicz"
nic się nie działo i można było zrobić warunek if lecz tutaj od razu wyrzuca błąd:

user image

1

1. (wspominał o tym )
Panel Sterowania > Region i język

Zakładka: Format
Format: Polski (Polska)

Jeśli masz inny to albo się do niego dostosuj (Ustawienia dodatkowe...), albo go zmień.

2.
Możesz zignorować ustawienia regionalne i używać w swojej aplikacji zawsze formatowania pl-PL.

using namespace System::Globalization;

CultureInfo^ culture = gcnew CultureInfo("pl-PL");
label1->Text = (Double::Parse(textBox1->Text, culture->NumberFormat) *
    Double::Parse(textBox2->Text, culture->NumberFormat)).ToString("0.## PLN");

W tym przypadku akceptowane będą liczby z separatorem dziesiętnym "," oraz tysięcznym " ".
Używanie kropki jako separatora dziesiętnego spowoduje błąd.

1

Jak możesz nawet sam zauważyć, kultur na świecie jest bardzo dużo: National Language Support (NLS) API Reference i może gdybyś poznał styl formatowania liczby każdej kultury, mógłbyś napisać uniwersalny kod. Jednak programiści w M$ wiedząc to wszystko postanowili, że uniwersalny kod będzie odwoływał się do ustawień regionalnych hosta. W ten sposób, dopóki trzymasz się reguł danej kultury (ustalonej w ustawieniach regionalnych) kod będzie się sprawdzał.

Teraz używasz u siebie "," jako separatora dziesiętnego. Pomyślisz pewnie o biednych Arabach, którzy używają "." i o swoim programie. Otóż taki Arab na 99% będzie miał ustawiony format Arabski zgodny z jego notacją oraz na 120% nie będzie to format Polski. Przy formacie arabskim twój program prawidłowo odczyta liczbę z ".", zaś przy polskim liczbę z ",". Wszystko będzie działać dobrze, dopóki użytkownik będzie stosował się do własnych ustawień regionalnych - za co ty nie jesteś odpowiedzialny jako programista. Jednakże wystąpienie wyjątku powinieneś obsłużyć.

(1) Na upartego możesz dać użytkownikowi wybór wg jakiej kultury ma sprawdzać liczbę niezależnie od jego ustawień regionalnych albo (2) zakombinować rozwiązanie z tym, co nakreślił .

Osobiście pozostałbym przy kodzie bez używania CultureInfo, bowiem dobro programisty, który używa "." dla liczb zmiennoprzecinkowych w kodzie, nie jest koniecznie dobrem użytkowników tego programu. Jeśli jednak podoba ci się używanie kropki wszędzie, to po prostu zmień własne ustawienia regionalne.

mK. 2013-03-28 21:39
Mam ustawione Format: Polski :) Po prostu myślałem, że można w dosyć łatwy sposób ustawić by kropka była tak samo przyjmowana jak przecinek ale jeżeli takiej opcji nie ma, to temat do zamknięcia.

(3) Inaczej kreuje się sytuacja, w której tworzysz program wyłącznie dla siebie. Możesz wtedy próbować odczytać liczbę z określoną kulturą pl-PL, a podczas wyjątku spróbować odczytać ją z kulturą en-US.

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