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 String nach Double? (https://www.delphipraxis.net/124207-string-nach-double.html)

daredd 16. Nov 2008 22:58


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

Sir Rufo 16. Nov 2008 23:01

Re: String nach Double?
 
Delphi-Referenz durchsuchenStrToFloat oder Delphi-Referenz durchsuchenStrToFloatDef

himitsu 16. Nov 2008 23:46

Re: String nach Double?
 
Auch noch Delphi-Referenz durchsuchenTryStrToFloat und sogar Delphi-Referenz durchsuchenVal wäre möglich.

Zitat:

Zitat von daredd
Unter vorrausetzung im TEdit.Text steht eine Zahl mit Komma?

Und was wenn nicht?

grizzly 17. Nov 2008 08:58

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:
TryStrToFloat('1e999', d);
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...

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

A.Griffin 29. Mär 2017 12:28

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?

nahpets 29. Mär 2017 12:43

AW: String nach Double?
 
Schau bitte mal nach TFormatSettings.

Damit kann man z. B. sowas machen:
Delphi-Quellcode:
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 := '.';
Die Einstellungen werden für's Programm entsprechend geändert.

jaenicke 29. Mär 2017 12:48

AW: String nach Double?
 
In einigermaßen aktuellen Delphiversionen kann man auch direkt dem Konstruktor eine Landessprache mitgeben:
http://docwiki.embarcadero.com/Libra...ettings.Create
Delphi-Quellcode:
USFormatSettings := TFormatSettings.Create('en-US');
...

Uwe Raabe 29. Mär 2017 13:19

AW: String nach Double?
 
Zitat:

Zitat von jaenicke (Beitrag 1365867)
Delphi-Quellcode:
USFormatSettings := TFormatSettings.Create('en-US');
...

Das kann aber immer noch schief gehen, wenn der User seine US-Settings angepasst hat (ich hätte ihn würgen können).

Sicherer ist dann immer noch TFormatSettings.Invariant.

HolgerX 29. Mär 2017 13:42

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:
function StrToFloatD(AStr : string; ADef : double = 0):double;
begin
  AStr := StringReplace(AStr,',',DecimalSeparator,[]);
  AStr := StringReplace(AStr,'.',DecimalSeparator,[]);
  result := StrToFloatDef(AStr,ADef);
end;
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.

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...

Rollo62 29. Mär 2017 13:55

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