Dynamiczna zmiana przecinka na kropkę

0

Witajcie.
Jak zwykle mam problem z najprostszymi rzeczami :/
A mianowicie: mam texboxa który musi być obwarowany wieloma warunkami dotyczącymi tekstu jaki mogę tam wpisać (mogę podać tylko określoną liczbę - napięcie mieszczące się w zakresie napięciowym). Sprawdzanie czy wszystko się zgadza robię w TextChanged:

        private void txtU1_TextChanged(object sender, EventArgs e)
        {
            try
            { 
                double changeU1 = Convert.ToDouble(txtU1.Text, System.Globalization.CultureInfo.InvariantCulture);
                if(cmbRangeU.SelectedIndex == 0)
                {
                    valRangeU = 500;
                }

                if (Convert.ToDouble(txtU1.Text, System.Globalization.CultureInfo.InvariantCulture) < minU || Convert.ToDouble(txtU1.Text, System.Globalization.CultureInfo.InvariantCulture) > maxU || Convert.ToDouble(txtU1.Text, System.Globalization.CultureInfo.InvariantCulture) > valRangeU) 
                {
                   txtU1.BackColor = Color.Red; //jeśli wartość jest mniejsza od min to podswietl na czerwono
                }
                else
                {
                    txtU1.BackColor = Color.White; //jesli dobra wartość to nie podswietlaj
                }
            }
            catch (FormatException)
            {
                txtU1.BackColor = Color.Red; 
            }
        }

i tu mam problem ponieważ jak wpiszę np. coś takiego: 20.34 to jest ok (kolor texboxa jest biały), ale jak już wpiszę 20,34 to kolor zamienia się na czerwony (mimo, że nie przekracza zakresu napięciowego ustawionego na 60V). Wiem tylko to, że w drugim przypadku on widzi tą liczbę jak 2034.
Nie mam pojęcia co robię źle :/

Mam również pytanie (jak w temacie) czyli czy jest możliwa w TextChanged dynamiczna zamiana przecinków na kropi. Czyli gdy wpiszę przecinek to automatycznie mi program zamieni to na kropkę??

Z góry wielkie dzięki za wszelką pomoc.
Pozdrawiam.

0
  1. Sprawdzanie poprawności danych w kontrolce sensowniej jest chyba robić przez dedykowane zdarzenie Validating.
    Niezły artykuł jest tutaj: http://www.codeguru.pl/article-101.aspx

  2. Dlaczego najpierw robisz coś takiego:

double changeU1 = Convert.ToDouble(txtU1.Text, System.Globalization.CultureInfo.InvariantCulture);

A później powtarzasz tę samą operację w ifie trzy razy? :|

Dokonujesz konwersji tekstu na liczbę wymuszając ustawienia CultureInfo.InvariantCulture, które sprawiają, że zamiast użycia ustawień właściwych dla systemu operacyjnego są używane ogólne. Czyli np. zamiast separatora dziesiętnego, którym w Polsce jest przecinek używana jest kropka. Dlaczego tak robisz? Bo to jest IMHO bez sensu.

Zamiany przecinka na kropkę możesz dokonać np. w zdarzeniu KeyDown czy KeyPress, które są przed TextChanged. Możesz też najpierw spróbować skonwertować liczbę z przecinkiem, jeśli się nie uda, to z kropką, a dopiero potem uznać za niewłaściwą.
Ale to wszystko obejścia.

0

Dokonujesz konwersji tekstu na liczbę wymuszając ustawienia CultureInfo.InvariantCulture, które sprawiają, że zamiast użycia ustawień właściwych dla systemu operacyjnego są używane ogólne. Czyli np. zamiast separatora dziesiętnego, którym w Polsce jest przecinek używana jest kropka. Dlaczego tak robisz? Bo to jest IMHO bez sensu.

Hmm, wybacz, ale za bardzo nie rozumiem. Chciałem aby przecinek i kropkę traktował tak samo czyli jako separator dziesiętny. Bez CultureInfo.InvariantCulture wywala błąd jak wpisuję z kropką. Jednym słowem chcę aby bez względu na ustawienia w systemie traktował przecinek tak samo jak kropkę i na odwrót.

1

Daj sobie

U1 = Convert.ToDouble(txtU1.Text.Replace(",", ".");

0
MSM napisał(a)

Daj sobie

U1 = Convert.ToDouble(txtU1.Text.Replace(",", ".");

to zadziała pod warunkiem, że CurrentCulture przypadkiem jako NumberDecimalSeparator nie używa przecinka. No ale zdaje się że autor posta tak dużych liczb używać nie będzie.

Można by też spróbować czegoś w tym stylu:

double result;
if (!Double.TryParse("2.2", System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.CultureInfo.CurrentCulture, out result)
   && !Double.TryParse("2.2", System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.CultureInfo.InvariantCulture, out result))
    result = defaultValue;  


0

Postanowiłem uprościć mój program i zrezygnowałem z przecinka (zablokowałem możliwość wpisywania go).
I mam tu pytanie: jak zrobić aby we wszystkich texboxach (globalnie) były ustawienia językowe angielskie (kropka jako separator)? Dodam, że jest to program na palmtopa z językiem polskim. Pytam się ponieważ w innym miejscu w kodzie mam coś takiego:

 _txtU1 = string.Format("{0:0.000}", Convert.ToDouble(txtU1.Text, new System.Globalization.CultureInfo("en-GB")));

Służy mi to do uzupełniania labela na innej formatce, ale po wykonaniu tego kodu liczbę np. 40.5 zamienia mi na 40,5.
Próbowałem deklarować coś takiego:
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-GB");
ale nie chce mi się to skompilować. Wybaczcie za poziom pytania ale, już siedzę kolejny dzień z rzędu nad tym i nic nie mogę wymyśleć :/

0
sergio napisał(a)

Dodam, że jest to program na palmtopa z językiem polskim.
(...)
Próbowałem deklarować coś takiego:
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-GB");
ale nie chce mi się to skompilować.

To chyba jest powiązane, tej właściwości nie ma w Compact Frameworku.

0

somekind napisał:

To chyba jest powiązane, tej właściwości nie ma w Compact Frameworku.

Hmm, no to lipa. Ktoś ma może jakiś pomysł aby to zrobić? Jak już wyżej napisałem, zależy mi aby:
_txtU1 = string.Format("{0:0.00}", Convert.ToDouble(txtU1.Text, CultureInfo.InvariantCulture));
nie ładowało do _txtU1 liczby z przecinkiem tylko z kropką.

0

W ramach desperacji stworzyłem coś takiego:

_txtU1 = string.Format("{0:0.00}", Convert.ToDouble(txtU1.Text, CultureInfo.InvariantCulture));

 string [] txt = {_txtU1,_txtI1,_txtFi1,_txtU2,_txtI2,_txtFi2,_txtU3,_txtI3,_txtFi3,_txtHz,_txtU12,_txtU13};
            for(int i =0; i< txt.Length; i++)
            {
                string[] tabString = null;
                tabString = txt[i].Split(',');
                if (tabString.Length == 2)
                {
                    txt[i] = tabString[0]+ "." + tabString[1];
                }
            }

Pętla bo _txtU1 to tylko jeden z wielu stringów którym się zajmuje. Ale to też nie działa, nie zmienia stringa w if-ie. Co ja robię źle?? Błagam o pomoc w rozwiązaniu problemu ;-(

1

string[] tabString = null; - po co to?

tabString = txt[i].Split(',');
                if (tabString.Length == 2)
                {
                    txt[i] = tabString[0]+ "." + tabString[1];
                }

tak zamieniasz przecinek na kropkę (po co ci ten if? przewidujesz liczby z większą iloścą przecinków? ;) )

            string[] txt = { "2,2", "2.2" };
            for (int i = 0; i < txt.Length; i++)
            {
                tabString = txt[i].Split(',');
                if (tabString.Length == 2)
                {
                    txt[i] = tabString[0] + "." + tabString[1];
                }
            }

Mi to działa... W tej tablicy txt ma być coś innego?...

0

_txtU1 = string.Format("{0:0.00}", Convert.ToDouble(txtU1.Text, CultureInfo.InvariantCulture));

string [] txt = {_txtU1,_txtI1,_txtFi1,_txtU2,_txtI2,_txtFi2,_txtU3,_txtI3,_txtFi3,_txtHz,_txtU12,_txtU13};
for(int i =0; i< txt.Length; i++)
{
string[] tabString = null;
tabString = txt[i].Split(',');
if (tabString.Length == 2)
{
txt[i] = tabString[0]+ "." + tabString[1];
}
}

Matko Bosko, Józefie Święty ! .. - zwykłe Replace() nie starczy? .. A w ogóle po co Replace ?? -- to się załatwia bez żadnych modyfikacji w zawartość stringa .. -a ci, którzy każą ci string zamienić na inny - niech sobie dokładnie poczytają na czym polega Globalization w .NET Framework.

0

Jakoś sobie poradziłem (w sumie przez cały czas miałem błąd którego nie widziałem). Zrobiłem coś takiego:

var culture = new CultureInfo("en-GB");
 _txtU1 = String.Format(culture, "{0:0.00}",Convert.ToDouble(txtU1.Text, CultureInfo.InvariantCulture));

Najważniejsze, że działa to znaczy nie zamienia mi np. 24.45 na 24,45 :d

1

Matko Bosko, Józefie Święty ! .. - zwykłe Replace() nie starczy? .. A w ogóle po co Replace ??

Moja pierwsza odpowiedź w tym temacie:

Daj sobie

U1 = Convert.ToDouble(txtU1.Text.Replace(",", ".");

Skoro mu nie wystarczyło to próbowałem coś zrobić dalej... -.-

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