AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

String nach Double?

Ein Thema von daredd · begonnen am 16. Nov 2008 · letzter Beitrag vom 29. Mär 2017
Antwort Antwort
Seite 1 von 2  1 2      
daredd

Registriert seit: 2. Apr 2006
433 Beiträge
 
#1

String nach Double?

  Alt 16. Nov 2008, 23:58
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
---------------------------------------------------------------------------
Mein Vista-Kind bringt frischen Wind

Gruß DaRedd aka The Red Dragon
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

Re: String nach Double?

  Alt 17. Nov 2008, 00:01
Delphi-Referenz durchsuchenStrToFloat oder Delphi-Referenz durchsuchenStrToFloatDef
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: String nach Double?

  Alt 17. Nov 2008, 00:46
Auch noch Delphi-Referenz durchsuchenTryStrToFloat und sogar Delphi-Referenz durchsuchenVal wäre möglich.

Zitat von daredd:
Unter vorrausetzung im TEdit.Text steht eine Zahl mit Komma?
Und was wenn nicht?
$2B or not $2B
  Mit Zitat antworten Zitat
grizzly

Registriert seit: 10. Dez 2004
150 Beiträge
 
Delphi XE4 Professional
 
#4

Re: String nach Double?

  Alt 17. Nov 2008, 09:58
Und immer schön die Exceptions abfangen. Keine der oben genannten Routinen arbeitet nämlich 100% sauber. Probier mal (mit d als double)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
  Mit Zitat antworten Zitat
A.Griffin

Registriert seit: 17. Feb 2017
94 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: String nach Double?

  Alt 29. Mär 2017, 13:28
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?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: String nach Double?

  Alt 29. Mär 2017, 13:43
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: String nach Double?

  Alt 29. Mär 2017, 13:48
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');
...
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#8

AW: String nach Double?

  Alt 29. Mär 2017, 14:19
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
 
Delphi 6 Professional
 
#9

AW: String nach Double?

  Alt 29. Mär 2017, 14:42
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 ) 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...
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#10

AW: String nach Double?

  Alt 29. Mär 2017, 14:55
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:43 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