![]() |
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 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