Delphi-PRAXiS

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;

A.Griffin 29. Mär 2017 13:59

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

a.def 29. Mär 2017 14:06

AW: String nach Double?
 
Schreibe dir doch eine minimale DLL die genau das tut und die lädst du in jedes deiner Programme.

nahpets 29. Mär 2017 14:18

AW: String nach Double?
 
Zitat:

Zitat von A.Griffin (Beitrag 1365876)
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 ".".

Global, für alle Programme?

Dann mach das doch in den Systemeinstellungen von Windows.

@HolgerX

TFormatSettings gibt es in Delphi 7. Mein Beispiel stammt aus Delphi 7.

HolgerX 29. Mär 2017 15:26

AW: String nach Double?
 
Zitat:

Zitat von nahpets (Beitrag 1365880)
@HolgerX

TFormatSettings gibt es in Delphi 7. Mein Beispiel stamm aus Delphi 7.

OK, danke.
Dann scheint es mit D7 hinein gekommen zu sein, bei D6 sind es noch einfache globale Variablen.. ;)

himitsu 29. Mär 2017 19:52

AW: String nach Double?
 
Zitat:

Zitat von HolgerX (Beitrag 1365885)
Zitat:

Zitat von nahpets (Beitrag 1365880)
@HolgerX

TFormatSettings gibt es in Delphi 7. Mein Beispiel stamm aus Delphi 7.

OK, danke.
Dann scheint es mit D7 hinein gekommen zu sein, bei D6 sind es noch einfache globale Variablen.. ;)

Delphi lädt beim Programmstart in eine globale TFormatSettings-Variable (in alten Delphis ist das noch nicht in einem Record, sondern in mehreren Einzelvariablen)
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 08:33 Uhr.

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