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
C/C++ Code:
----------------------------------------------------------.cpp
Besteht die Gefahr, daß deine Benutzer mit 1000-er Seperatoren
arbeiten?
Wenn ja, dann gibt es keine wirklich gute Lösung dafür. Allerdings
sollte man ihnen das IMHO sowieso abgewöhnen. Führt in der Praxis
immer wieder zu Ärger.
Zu deinem Problem.
Die MFC-spezial DDX Makros, mit denen man ein Edit Feld so
einschränken kann, daß eine Zahleneingabe erwartet wird, sind
so in der Praxis sowieso Müll. Lösch einfach mal die Zahl aus
so einem Edit Feld raus (zb. mit einem Backspace) und die MFC
mault rum, daß man bitte eine Zahl eingeben möge. Einen Endbenutzer
kann man damit in den Wahnsinn treiben.
Lösung: Auch Zahleneingaben immer als Texteingaben machen, und
die Umwandlung in eine Zahl dann selbst (zb. mit einem sscanf)
machen. Dann ist es auch einfach im String, den man vom Control
bekommt, alle ',' durch '.' zu ersetzen, sodaß sscanf das richtig
parsen kann. Der Vorteil: Der Benutzer kann dann wahlweise
sowohl ',' als auch '.' als Dezimaltrenner verwenden. Geht aber
klarerweise nur dann, wenn 1000-er Seperatoren nicht benutzt werden.
Wir haben uns dafür spezielle DDX Funktionen geschrieben.
Zb. sowas
Die haben dann auch noch den netten Nebeneffekt, dass man die
Anzahl der auszugebenden Nachkommastellen sauber definieren
kann.
Wenn der Dialog dann fertig ist, wird die DDX Zeile in DoDataExchange
gegen einen Aufruf so einer Funktion ersetzt:
1000er-Separatoren ließen sich abfangen, indem vor der Konvertierung die
Anzahl der Punkte und Kommata bestimmt wird bzw. das letzte
entsprechende Zeichen im String als Dezimal{punkt|komma} verwendet wird:
"1.000,23"
Allerdings bleibt auch dann so etwas wie "1.000" nicht anständig
interpretierbar.
Hi
Sieh mal nach, ob dein Compiler eine globale Variable 'Decimalseparator'
kennt. Unter Delphi lässt sich das nämlich ganz einfach einstellen:
decimalseparetor:=',';
MfG Spess
Nein, das kennt der Compiler nicht - das hier ist eine MFC-Anwendung.
Wobei es auch gar nicht dorthin gehört, richtig wäre es, die
Locale-Informationen über das verwendete Zahlenformat auszuwerten.
Die für das Einlesen von Float-Zahlen verwendbare Funktion atof kann
sehr wohl auch die Locale-Einstellugen des OS auswerten, dazu muss nur
im Programm die Win32-API-Funktion setlocale mit der Kategorie
LC_NUMERIC und dem entsprechenden Landescode aufgerufen werden.
Rufus t. Firefly wrote:
> Nein, das kennt der Compiler nicht - das hier ist eine MFC-Anwendung.>> Wobei es auch gar nicht dorthin gehört, richtig wäre es, die> Locale-Informationen über das verwendete Zahlenformat auszuwerten.
Yep. Das wäre die schöne Lösung.
Der Krampf an der Sache (in meinem/unserem Fall) ist aber, daß
viele Leute aus der Technik daran gewöhnt sind einen Kommapunkt
einzugeben. Und wenn deine Clientel dann aus eine Mischung aus
Punkt und Komma Fetischisten besteht, hast du den A.... offen.
Für uns hat sich die Lösung mit dem String manipulieren
bewährt.
Jeder der schon mal versucht hat eine amerikanische
Datendatei in ein deutsches Excel zu importieren, kennt diesen
Krampf.