Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Punkt und Komma in Textbox zulassen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
29.04.2004, 16:24 Uhr
~A-l-e-x
Gast


Wie kann ich es hinkriegen, dass man in einer Textbox für eine Zahleneingabe ein Punkt (z.B. englisch) oder ein Komma (z.B. deutsch) zulassen kann, ohne dass eine Fehlermeldung ("Geben Sie bitte eine Zahl ein") kommt. Ich kann irgendwie nur ein Punkt zulassen.

mfg A-l-e-x
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.04.2004, 19:35 Uhr
~mike
Gast


Hi!
Ich bin mir jetzt nicht 100% sicher, aber probier mal setlocale(LC_NUMERIC, "English" ); Kanns mom leider nicht testen

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.04.2004, 14:51 Uhr
~A-l-e-x
Gast


Der Compiler erkennt "setlocale" und "LC_NUMERIC" nicht! Muss ich die jetzt deklarieren? Wenn ja, dann als was?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.05.2004, 09:13 Uhr
Tommix



'Morgen
#include <locale.h>
-Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.05.2004, 19:28 Uhr
~A-l-e-x
Gast


Ok, keine Fehler und Warnungen. Doch will er immer noch nicht das Komma akzeptieren! Muss ich ihn etwa an einer speziellen Stelle im Code einfügen .
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
03.05.2004, 08:19 Uhr
Tommix



Für das Komma muss es natürlich setlocale(LC_NUMERIC, "German") heissen. Falls das nichts hilft, probier mal setlocale(LC_ALL, "German").

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
03.05.2004, 17:52 Uhr
~A-l-e-x
Gast


Ich sehe gerade, dass ich bei der Überschrift richtig also ... UND ... und hier oben ... ODER ... Ich will also dass man , (Komma) UND . (Punkt) zulässt. Sorry
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
03.05.2004, 18:15 Uhr
~mike
Gast


Hi!
Ich glaube das geht nicht mehr so einfach. Du musst da die Eingabe wohl in einen CString schreiben und dann selbst parsen. Das einfachste wäre, wenn du den CString in ein char * gibst und anschließend auf Syntax überprüfst. atoi und atof wandeln dann den char * in eine Zahl um

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
04.05.2004, 13:47 Uhr
~A-l-e-x
Gast


Ok, kannst du mir auch einen Beispielcode schreiben (,denn ich krieg's warscheinlich nicht hin ).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
04.05.2004, 16:01 Uhr
Tommix



Ich hatte da mal was gebastelt. Das Eingabefeld bekommt eine Variable vom Typ CString und sei im Dialog CEditDialog. ReFormat ersetzt Komma durch Punkt, setzt auf defaultVal, wenn die Eingabe keine Zahl war und begrenzt auf min/max.


C++:
//  EditDialog.h:
#include <float.h>

class CEditDialog : public CDialog
{
//...
private:
  void ReFormat(CString& value, double defaultVal = 0.0,
    double min = -DBL_MAX, double max = DBL_MAX, int digits = 3) const;
};

// EditDialog.cpp:

void CEditDialog::ReFormat(CString& value, double defaultVal,
                           double min, double max, int digits) const
{
    double val;
    
    {
        value.Replace(',', '.');
        /*CLocale locale(CLocale::international);*/
        
        if (1 == sscanf(value, "%lf", &val))
        {
            if (val < min)
                val = min;
            else if (val > max)
                val = max;
        }
        else
        {
            val = defaultVal;
        }
    }
    
    CString format;
    ASSERT((digits >= 0) && (digits <= 9));

    format.Format("%%.%df", digits);
    value.Format(format, val);
}



Für die Eingabefelder überlädt man dann OnKillFocus, also z.B.

C++:
void CEditDialog::OnKillfocusEditX()
{
    UpdateData();
    ReFormat(m_x, default_x, -999.999, 999.999);
    UpdateData(FALSE);
}



An den Wert kommst Du dann mit

C++:
double val;
sscanf(m_x, "%lf", &val)


Eventuell ist das ganze etwas überpowert aber ich hatte es, wie gesagt, so in der Schublade.

Gruss, Tommix


Bearbeitung:

CLocale hatten wir vor ein paar Tagen mal, brauchst Du aber nicht.


Dieser Post wurde am 04.05.2004 um 16:03 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: