Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Punkt statt Komma beim rechnen...

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 ] [ 3 ]
000
06.04.2004, 17:04 Uhr
~MDDM
Gast


Hallo

Ich habe ein Problem. (klar sonst würde ich ja hier nicht posten)
Ich habe Editfelder mit denen ich rechne. Jedem Editfeld habe ich ne variable verpasst. Einen Button habe ich zum rechen. Das alles klappt nur eben muß ich bei Kommazahlen einen Punkt machen. Auf dem NUM-Block der Tastatur ist aber ien Komma und es stört unheimlich jedesmal links rüber wandern zu müssen.
Die Variablen der Editfelder sind alle vom Typ float.

Ich weis das ich die Variablen als CString anlegen muß und dann von CString in int und für die Ausgabe wieder zurück nach CString. Aber wie mache ich das?

Danke im Vorraus

MfG Maik
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.04.2004, 17:16 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


indem du einfach ne funktion über den string laufen lässt und alle kommata durch punkte ersetzen lässt und umgekehrt

ohne das jetzt zu testen einfach so ins Forum gehackt
//von Editfeld nach zahl

C++:
CString str;
GetDlgItem(IDC_EDIT_....)->GetWindowText(str);
str.Replace(',','.');
double number=atof(number);



//von Zahl nach Editfeld

C++:
CString str;
double number=4711.0815;
str.Format("%f",number);
str.Replace('.',',');
GetDlgItem(IDC_EDIT_....)->SetWindowText(str);


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 06.04.2004 um 17:16 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.04.2004, 15:55 Uhr
Tommix



Hallo,
Warum einfach, wenns auch umständlich geht Stell Dir mal ein Projekt mit zehn Dialogen x zehn Eingabefeldern vor.

Du kannst den Dezimaltrenner global auf "Komma" einstellen (für Ein- und Ausgaben). Ich habs mal in 'ner Klasse verpackt:

C++:
Header:

class CLocale : public CObject  
{
public:
    enum Support
    {
        international,
        national
    };

public:
    CString OldLocale() const;
    CString CurrentLocale() const;
    CLocale(Support support);
    virtual ~CLocale();

private:
    char* m_pCurrentLocale;
    char* m_pOldLocale;
};


Quellcode:

#include "stdafx.h"
#include "CLocale.h"

#include <locale.h>

CLocale::CLocale(Support support)
:   m_pOldLocale(NULL), m_pCurrentLocale(NULL)
{
    int size;

    char* oldLocale = setlocale(LC_ALL, NULL);
    VERIFY(m_pOldLocale = new char[strlen(oldLocale)+1]);
    strcpy(m_pOldLocale, oldLocale);

    switch(support)
    {
    case international:
        m_pCurrentLocale = new char[2];
        strcpy(m_pCurrentLocale, "C");
        
        break;

    case national:
        size = GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SENGLANGUAGE, NULL, 0);
        m_pCurrentLocale = new char[size];

        GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SENGLANGUAGE,
            m_pCurrentLocale, size);

        break;

    default:
        ASSERT(FALSE);
    }

    ASSERT(m_pCurrentLocale);
    setlocale(LC_ALL, m_pCurrentLocale);
}

CLocale::~CLocale()
{
    ASSERT(m_pOldLocale);

    setlocale(LC_ALL, m_pOldLocale);

    delete[] m_pOldLocale;
    delete[] m_pCurrentLocale;
}

CString CLocale::CurrentLocale() const
{
    ASSERT(m_pCurrentLocale);
    return CString(m_pCurrentLocale);
}

CString CLocale::OldLocale() const
{
    ASSERT(m_pOldLocale);
    return CString(m_pOldLocale);
}



Sobald Du lokale Schreibweise brauchst, erzegst Du mit CLocale global_locale(CLocale::national); ein Objekt. In Funktionen, die mit Punkt arbeiten sollen (z.B. für Dateiarbeit) erzeugst ein lokales CLocale locale(CLocale::international); Beim Verlassen der Funktion schaltet dessen Destruktor wieder auf "National" usw.

Gruss, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.04.2004, 16:23 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Tommix
und was soll daran einfacher sein...
die funktion die mir das hin und her konvertiert schreib ich ja auch nur einmal um sie dann in ner schleife auzurufen...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.04.2004, 16:41 Uhr
Tommix



Naja mit meiner Methode kann man an einer zentralen Stelle die Sprache auf "lokal" setzen, wobei die Spracheinstellung der Windows-Systemsteuerung berücksichtigt wird. Ich muß gar nicht wissen, wie der Dezimaltrenner auf dem Rechner, auf dem das Programm mal laufen wird, aussieht. Und ich habe alles auf einmal erschlagen: sscanf, printf, CString::Format, Eingabeboxen die mit doubles verknüpft sind usw.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.04.2004, 16:54 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


du fängst schon an wie virtual...
Ich glaub ich muss mich vor dir in acht nehmen
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.04.2004, 21:41 Uhr
~MDDM
Gast


Ähm ok. Ich werde dann mal probieren das ich das hinbekomme.
Danke erstmal.

Maik
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.04.2004, 15:52 Uhr
~MDDM
Gast


@Tommix

Wie muß ich das machen? ich erstelle mir eine neue headerdatei mit dem namen locale.h?

und in den quellcode meiner dialogfeldanwendung schreibe ich den rest rein?
in die xxxDlg.cpp oder in die xxx.cpp??

MfG Maik
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.04.2004, 16:03 Uhr
~toxic
Gast


hi, du erstellst eine neue klasse "CLocale", und füllst jeweils den header & die cpp der CLocale-klasse.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.04.2004, 09:29 Uhr
~MDDM
Gast


Und von welcher Basisklasse leite ich meine neue Klasse ab??
Von CDialog? oder von welcher?

MfG Maik
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ 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: