![]() |
String nach Double?
Kann mir einer auf die Sprünge helfen, wie mach ich aus einem TEdit.Text (String) ein Double?
Unter vorrausetzung im TEdit.Text steht eine Zahl mit Komma? THX |
Re: String nach Double?
|
Re: String nach Double?
Auch noch
![]() ![]() Zitat:
|
Re: String nach Double?
Und immer schön die Exceptions abfangen. Keine der oben genannten Routinen arbeitet nämlich 100% sauber. Probier mal (mit d als double)
Delphi-Quellcode:
Das liefert nämlich nicht einfach nur false (1e999 paßt nicht in einen double), sondern löst eine Exception aus. Das Problem ist, daß 1e999 in einen extended paßt. Die ganzen Routinen wandeln erst in ein extended um, und dann wird ohne Rücksicht auf Verluste das Ergebnis in einen double kopiert...
TryStrToFloat('1e999', d);
Und wie ich gehört habe, hat Val() zum letztenmal unter Turbo-Pascal sauber funktioniert... Vielleicht ist man am Besten dran mit den Routinen, bei denen man immer eine Exception erwartet, wenn die Umwandlung nicht klappt. Dann wird man wenigstens nicht kalt erwischt. ;) Gruß Michael |
AW: String nach Double?
Ich musste vor kurzem auch StrToFloat benutzen und man muss auch noch "DecimalSeparator" beachten. Kann man verhindern, dass Delphi (in meinem Fall Delphi 7.1) den DecimalSeparator aus dem Betriebssystem nimmt und stattdessen immer '.' nutzt?
|
AW: String nach Double?
Schau bitte mal nach
![]() Damit kann man z. B. sowas machen:
Delphi-Quellcode:
Die Einstellungen werden für's Programm entsprechend geändert.
var
fFormatSettings : TFormatSettings; ... GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT,fFormatSettings); fFormatSettings.LongDateFormat := 'YYYY-MM-DD'; fFormatSettings.LongTimeFormat := 'hh:mm:ss.zzz'; fFormatSettings.ShortDateFormat := 'YYYY-MM-DD'; fFormatSettings.ShortTimeFormat := 'hh:mm:ss.zzz'; fFormatSettings.DecimalSeparator := '.'; |
AW: String nach Double?
In einigermaßen aktuellen Delphiversionen kann man auch direkt dem Konstruktor eine Landessprache mitgeben:
![]()
Delphi-Quellcode:
USFormatSettings := TFormatSettings.Create('en-US');
... |
AW: String nach Double?
Zitat:
Sicherer ist dann immer noch ![]() |
AW: String nach Double?
Hmm..
da es dei TFormatSettings in Delphi 7 noch nicht gibt (soweit ich weis), kannst Du eventuell mit der Funktion was Anfangen: (Diese verwende ich bei Delphi 6)
Delphi-Quellcode:
Damit ist eigendlich sicher gestellt, das der DecimalSeparator im String steht (ausgenommen, wenn der String tausendertrennzeichen enthält :cry: ) und somit das normale StrToFloatDef einen brauchbaren Sting bekommt.
function StrToFloatD(AStr : string; ADef : double = 0):double;
begin AStr := StringReplace(AStr,',',DecimalSeparator,[]); AStr := StringReplace(AStr,'.',DecimalSeparator,[]); result := StrToFloatDef(AStr,ADef); end; Dieses verwendet nämlich immer den DecimalSeparator. Alternativ kann man auch vor StrToFloat den DecimalSeparator auf '.' setzen und nachher wieder zurück. Bedenke jedoch, dass es dann an anderer Stelle in deinem Programm Probleme geben kann, da DecimalSeparator eine globale Var ist... |
AW: String nach Double?
Dann schon besser so ...
Delphi-Quellcode:
function StrToFloatD(AStr : string; ADef : double = 0):double;
begin if '.' = DecimalSeparator then AStr := StringReplace(AStr,',',DecimalSeparator,[]) else if ',' = DecimalSeparator then AStr := StringReplace(AStr,'.',DecimalSeparator,[]) else EXception; // das sollte nie passieren, oder gibt es doch solche Länder ? result := StrToFloatDef(AStr,ADef); end; |
AW: String nach Double?
Ich wollte eigentlich wissen ob es global möglich ist, so dass ich nicht im jedem Programm den DecimalSeperator festlegen muss. Jetzt habe ich einfach bei FormCreate "DecimalSeparator := '.';" drin. Ich fange eh alle "," ab und ersetze sie durch ".".
|
AW: String nach Double?
Schreibe dir doch eine minimale DLL die genau das tut und die lädst du in jedes deiner Programme.
|
AW: String nach Double?
Zitat:
Dann mach das doch in den Systemeinstellungen von Windows. @HolgerX TFormatSettings gibt es in Delphi 7. Mein Beispiel stammt aus Delphi 7. |
AW: String nach Double?
Zitat:
Dann scheint es mit D7 hinein gekommen zu sein, bei D6 sind es noch einfache globale Variablen.. ;) |
AW: String nach Double?
Zitat:
Man kann diese Variablen natürlich überschreiben, aber man sollte bedenken, dass Delphi "schlau" ist und auf eine Systemänderung und die nachfolgende BroadcastMessage WM_SETTINGCHANGE reagiert und die Einstellungen neu lädt. Der Record TFormatSettings und die Parameter an den StrTo...- und ...ToStr-Funktionen können bereits in D7 reingekommen sein, aber der neue Constructor ist eventuell erst seit D2006 vorhanden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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