Parameter Dialog: Komma anstatt Punkt



  • Hallo Zusammen,

    ich habe in meinem Programm ein CDialog integriert.
    Es soll im Feld als Parameter eine float Zahl eingegeben werden.
    Das Problem, es wird Punkt anstatt Komma akzeptiert, z. B. "0.03"
    wie kann eine Gleitkommazahl entwieder mit komma oder Punkt angenommen werden?

    Danke

    ----------------------------------------------------------.cpp
    
    /////////////////////////////////////////////////////////////////////////////
    // Dialogfeld CKalibrierfaktor 
    
    CKalibrierfaktor::CKalibrierfaktor(CWnd* pParent)
    	: CDialog(CKalibrierfaktor::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(CKalibrierfaktor)
    	m_fWert = 0.0f;
    	//}}AFX_DATA_INIT
    }
    
    void CKalibrierfaktor::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CKalibrierfaktor)
    	DDX_Text(pDX, IDC_txtFaktor, m_fWert);
    	DDV_MinMaxFloat(pDX, m_fWert, 0.f, 100.f);
    	//}}AFX_DATA_MAP
    }
    
    BEGIN_MESSAGE_MAP(CKalibrierfaktor, CDialog)
    	//{{AFX_MSG_MAP(CKalibrierfaktor)
    		// HINWEIS: Der Klassen-Assistent fügt hier Zuordnungsmakros für Nachrichten ein
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    ----------------------------------------------------------.h
    
    class CKalibrierfaktor : public CDialog
    {
    // Konstruktion
    public:
    	CKalibrierfaktor(CWnd* pParent = NULL);   // Standardkonstruktor
    
    // Dialogfelddaten
    	//{{AFX_DATA(CKalibrierfaktor)
    	enum { IDD = IDD_DLGFaktor };
    	float	m_fWert;
    	//}}AFX_DATA
    
    // Überschreibungen
    	// Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen
    	//{{AFX_VIRTUAL(CKalibrierfaktor)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    	//}}AFX_VIRTUAL
    
    // Implementierung
    protected:
    
    	// Generierte Nachrichtenzuordnungsfunktionen
    	//{{AFX_MSG(CKalibrierfaktor)
    		// HINWEIS: Der Klassen-Assistent fügt hier Member-Funktionen ein
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    


  • Naja, da gibts mehrere Möglichkeiten. Ich glaube da gabs eine Klasse für ein Edit-Control bei codeproject, der man gewisse Eigenschaften (auch Einheiten oder Währungszeichen) geben konnte.
    Zweite Möglichkeit: die interpretierst die Inhalte als Text und machst die Konvertierung in die Fließkommazahlen im Hintergrund. Allerdings hast du dann nicht mehr die Möglichkeit, DDX/DDV in vollem Umfang zu nutzen.
    Schau mal hier: http://functionx.com/visualc/applications/pledge.htm
    Da sind auch ein paar Anregungen im unteren Teil zu finden. Prinzipiell lässt sich das auch auf das Punkt-Komma-Problem von dir anwenden.



  • Sieh dir mal an:

    setlocale( LC_ALL, "deu" );
    //LC_ALL: für alles 
    //LC_NUMERIC: für Zahlendarstellung
    //etc.
    

    In InitInstance verwendet, gilt dies allerdings für das ganze Projekt. In Edit-feldern kann dann das Dezimalkomma eingegeben werden, im Quelltext natürlich weiterhin der Dezimalpunkt.



  • Tester2 schrieb:

    Sieh dir mal an:

    setlocale( LC_ALL, "deu" );
    //LC_ALL: für alles 
    //LC_NUMERIC: für Zahlendarstellung
    //etc.
    

    In InitInstance verwendet, gilt dies allerdings für das ganze Projekt. In Edit-feldern kann dann das Dezimalkomma eingegeben werden, im Quelltext natürlich weiterhin der Dezimalpunkt.

    Hallo Tester2,

    ich habe mich bei www.mikrocontroller.net registr. und die gleiche Frage getellt.
    Ein netter Type hat mit Lösung geantwortet:

    void C3dDDX_Text( CDataExchange* pDX, int nIdC, double& d, int Comma = 2 );
    
    void C3dDDX_Text( CDataExchange* pDX, int nIdC, double& d, int Comma /* = 2 */ )
    {
      CWnd*   pWnd = pDX->m_pDlgWnd->GetDlgItem( nIdC );
      CString str;
    
      pDX->PrepareEditCtrl( nIdC );
    
      ASSERT( pWnd );
      if( pDX->m_bSaveAndValidate ) {
        pWnd->GetWindowText( str );
    
        int n = str.Find( _T( "," ) );
        if( -1 < n ) {
          str.SetAt( n, '.' );
        }
    
        d = 0;
        _stscanf( str, _T( "%lf" ), &d );
      }
    
      else {
        TCHAR szBuf[64];
        _stprintf( szBuf, _T( "%-8.*lf" ), Comma, d );
        pWnd->SetWindowText( szBuf );
      }
    }
    

    Es hat funktioniert.
    Interessiert mich aber auch zu wissen, was du mit:

    setlocale( LC_ALL, "deu" );
    

    meinst. Bitte detailiert erklären, bin anfänger++ 🙂 ..

    🙂



  • Am besten Du siehst dir zur Run-Time-Funktion setlocale(...) mal die Hilfe an. Da sind dann auch die Parameter Kategorie und Ländercode erklärt.
    Ich setze damit z.B. in der InitInstance-Methode den Ländercode für die gesamte Anwendung. Mit LC_ALL werden z.B. alle Kategorien (Währung, numerische Werte, Zeichenketten etc. ) gesetzt.

    setlocale( LC_ALL, "English" ); //alle Englisch
    setlocale( LC_ALL, "germany" ); //alles deutsch
    
    setlocale( LC_NUMERIC, "DEU" );//numerisch, Deutsch ->Komma statt Dezimalpunkt ist in Edit-Feldern einzugeben
    setlocale( LC_NUMERIC, "germany" );//analog zu "DEU"
    setlocale( LC_LC_TIME, "germany" );//Zeiten werden im deutschen Format ausgegeben 
    //also z.B.'Mittwoch, 12. Mai 2004' statt 'Wednesday, May 12, 2004' 
    //oder 12.12.2008 statt 2008-12-12 
    ...
    

    Am besten einfach mal ausprobieren.


Anmelden zum Antworten