Delphi-PRAXiS

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 20: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 20: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 20: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 20: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 20: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 20: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 20:44

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

Muetze1 14. Jul 2007 13: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 16: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 17: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...

Tommy82 16. Jul 2007 09:46

Re: StrToFloat klappt nur mit ','
 
Naja, und falls nicht, dann sorgt man halt dafür, dass man 2 Kommastellen hat. Sowas sollte doch mit ROUND() kein problem sein oder ?

mfg

Tommy82

Muetze1 16. Jul 2007 09:54

Re: StrToFloat klappt nur mit ','
 
Zitat:

Zitat von Tommy82
Naja, und falls nicht, dann sorgt man halt dafür, dass man 2 Kommastellen hat. Sowas sollte doch mit ROUND() kein problem sein oder ?

Wow, dein Round() akzeptiert Strings zum runden?

Überleg doch mal wovon wir und du rede(n/st)! Wir haben einen String mit x Nachkommastellen und den willst du umwandeln. Punkte und Komma im String ersetzen mit was anderen ist ja ok, aber dann bekommt es StrToFloat(). Wo willst du dann noch runden, wo du doch schon die Nachkommastellen im String zerstört hast?

TeronG 16. Jul 2007 09:58

Re: StrToFloat klappt nur mit ','
 
Zitat:

Zitat von Tommy82
Naja, und falls nicht, dann sorgt man halt dafür, dass man 2 Kommastellen hat. Sowas sollte doch mit ROUND() kein problem sein oder ?

mfg

Tommy82

LOL einfach mal "wichtige" Zahlen runden, nur damit man "schöner" umrechnen kann!?
Wenn ich das so einfach mit meinen Prozessdaten machen würde :shock: uiuiui ^^

Chemiker 16. Jul 2007 15:07

Re: StrToFloat klappt nur mit ','
 
Hallo,

ich werfen einfach mal die Procedure VAL(); in die Diskussion.

Damit ist es auch möglich einen String in eine Zahl zu konvertieren.

z.B.:

[code=delphi]Val(Wert, Zahl, Code);
If Code= 0 then
begin
//Zahl hat das Komma als Punkt;
end
else
if Wert[Code]= ',' then // Wenn doch ein Komma dann in einem Punkt umwandeln
begin
Wert
Code:
:= '.';
  Val(StWert, Zahl, Code); // Prüfen ob es sich jetzt um eine Zahl handelt
end;
Damit ist es nun egal, ob Punkt oder Komma.

Bis bald Chemiker


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:04 Uhr.

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