Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StrToFloat klappt nur mit ',' (https://www.delphipraxis.net/95827-strtofloat-klappt-nur-mit.html)

Todd 13. Jul 2007 19:16


StrToFloat klappt nur mit ','
 
Hallo zusammen,

wenn ich einen String in einen Double Wert konvertieren will, klappt das nur wenn der Fließkommawert als Trennzeichen ein Komma enthält. Ich habe aber ausschließlich Zahlen, die punktweise (getrennt) werden.
Die stehen in einem TStringGrid und es muss auf Benutzerfehleingaben abgefangen werden. Deshalb prüfe ich mit try and catch ob sich der String in einen float Wert überführen kann. Das klappt aber nicht bei z.b. 1.2 sondern nur bei 1,2...

Hilfe...

HalloDu 13. Jul 2007 19:17

Re: StrToFloat klappt nur mit ','
 
Um mal ne schlampige Verainte zu nenneb (gibt bestimmt ne effizientere :mrgreen: ):
ersetzt doch einfach alle Punkte durch Kommata und mach dann strtofloat :mrgreen:

mkinzler 13. Jul 2007 19:19

Re: StrToFloat klappt nur mit ','
 
Oder Setzte die Konstanten DecimalSeparator/ThousandSeparator temporar oder verwende, so vorhanden die überladene Version mit übergabe des Formats.

HalloDu 13. Jul 2007 19:21

Re: StrToFloat klappt nur mit ','
 
Siehst du das meinte ich mit effizienterer Variante, die ich halt gerade nicht im Kopf hatte :mrgreen:

Der_Unwissende 13. Jul 2007 19:30

Re: StrToFloat klappt nur mit ','
 
Zitat:

Zitat von mkinzler
oder verwende, so vorhanden die überladene Version mit übergabe des Formats.

Hi,
das wäre die sauberste Lösung. Beim Überschreiben des Wertes in der globalen Variable bekommst Du immer dann ein Problem, wenn jmd. anderes den selben Gedanken hatte (und erfahrungsgemäß passiert sowas früher oder später mal). Deshalb einfach eine lokale FormatSettings Variable nehmen und die Eigenschaft ändern:

Delphi-Quellcode:
var formatSettings: TFormatSettings;
begin
  GetLocaleFormatSettings(GetUserDefaultLCID, formatSettings);
  formatSettings.DecimalSeparator := '.';

  f := StrToFloat(s, formatSettings);
end;
Dabei wird hier einfach die lokale Einstellung des Benutzers verwendet, der Dezimalseperator durch einen Punkt ersetzt und dann eben die überladene StrToFloat-Funktion aufgerufen. Analog sieht es aus, wenn Du ein Float in einen String konvertieren willst, wobei dann im String das entsprechende Dezimaltrennzeichen verwendet wird.

Gruß Der Unwissende

mkinzler 13. Jul 2007 19:34

Re: StrToFloat klappt nur mit ','
 
Zitat:

Beim Überschreiben des Wertes in der globalen Variable bekommst Du immer dann ein Problem, wenn jmd. anderes den selben Gedanken hatte
Das Verändern der Konstante ändert nicht die Systemeinstellungen, sondern wirkt nur in dem aktiven Programm

Todd 13. Jul 2007 19:44

Re: StrToFloat klappt nur mit ','
 
super...
hat funktioniert.

Muetze1 14. Jul 2007 12:54

Re: StrToFloat klappt nur mit ','
 
Zitat:

Zitat von mkinzler
Zitat:

Beim Überschreiben des Wertes in der globalen Variable bekommst Du immer dann ein Problem, wenn jmd. anderes den selben Gedanken hatte
Das Verändern der Konstante ändert nicht die Systemeinstellungen, sondern wirkt nur in dem aktiven Programm

Ja, und leider setzen manche VCL Komponenten diesen einfach wieder zurück. Afair sind manche Datenbankenkomponenten leider so programmiert. Mit dem verändern vom DecimalSeparator habe ich einer Anwendung massive Probleme gehabt, da zwischendurch dieser wieder zurück gesetzt wurde. Dabei hatte die App das Umsetzen beim Start durchgeführt und dann nirgendwo wieder angefasst. Es waren nur Standardkomponenten und ein paar eigene vorhanden (welche dies auch nicht geändert haben). Nun nutze ich einfach die ersetzen Methode:

Delphi-Quellcode:
function MyStrToFloat(AString: string): double;
begin
  AString := StringReplace(AString, '.', DecimalSeparator, [rfIgnoreCase, rfReplaceAll]);
  AString := StringReplace(AString, ',', DecimalSeparator, [rfIgnoreCase, rfReplaceAll]);
  result := StrToFloat(AString);
end;
Voraussetzung für diese Methode: es gibt keine Tausender-Trennzeichen.

Tommy82 14. Jul 2007 15:32

Re: StrToFloat klappt nur mit ','
 
Hallo,

falls es doch einen Tausender-Trennpunkt gibt, einfach alle komma´s und Punkte raus, dann "StrToFloat" und anschließend nochmal durch 100 teilen.
Da kommt man auch aufs richtige Ergebnis, unabhängig von Tausenderpunk

mfg

Tommy82

GuenterS 14. Jul 2007 16:46

Re: StrToFloat klappt nur mit ','
 
Zitat:

Zitat von Tommy82
Hallo,

falls es doch einen Tausender-Trennpunkt gibt, einfach alle komma´s und Punkte raus, dann "StrToFloat" und anschließend nochmal durch 100 teilen.
Da kommt man auch aufs richtige Ergebnis, unabhängig von Tausenderpunk

mfg

Tommy82

Das ist sicher eine ganz tolle Idee, vor allem weil wir IMMER 2 Nachkommastellen haben...


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:39 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz