Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - FloatToString mit Punkt statt Komma


HenryHux - So 19.12.10 14:07
Titel: FloatToString mit Punkt statt Komma
Hi,

bei der Typumwandlung von Gleitkommazahlen zu Strings, werden nachkommazahlen ja übelicherweise duch ein , getrennt.
Krieg ich das auch einfach mit nem Punkt hin oder muss ich den String mühsam zerpflücken?

Lg


bummi - So 19.12.10 14:14

StringReplace('1234.234','.',DecimalSeparator,[])


delfiphan - So 19.12.10 14:19


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  InvariantSettings: TFormatSettings;
begin
  InvariantSettings.DecimalSeparator := '.';
  ...
  FloatToStr(0.5, InvariantSettings);


Oder, wenn du's global ändern willst: DecimalSeparator := '.';

Oder als erste Unit SetThreadLocale auf English (U.S.) setzen (SetThreadLocale($0409);).


HenryHux - So 19.12.10 14:25

Danke!
Genau das, was ich suchte.

Lg


dummzeuch - So 19.12.10 20:07

user profile icondelfiphan hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  InvariantSettings: TFormatSettings;
begin
  InvariantSettings.DecimalSeparator := '.';
  ...
  FloatToStr(0.5, InvariantSettings);


Ahem: Ist das so sinnvoll? Eine nicht initialisierte (Record-)Variable, bei der nur ein einziges Feld gesetzt wird als Parameter uebergeben? Ich haette da zumindest versucht, die Variable mit den Systemeinstellungen vorzubelegen und erst dann das Feld DecimalSeparator zu aendern.

twm


delfiphan - Mo 20.12.10 00:52

Nein, natürlich nicht. Ich wollte nur andeuten, wie das zu tun ist. In der Praxis hätte man die Variable vielleicht in globalem Scope oder in einer Klasse und würde die anderen Felder auch definieren.


TheChicken - Di 25.10.11 09:41

Hallo,

ich habe gerade zum wiederholten Male das selbe Problem gehabt und immer irgendwie gelöst. Jedoch meine ich heute endlich mal eine "gute" Lösung gefunden zu haben. Dabei nutze ich ebenfalls die TFormatSettings-Variable, die ich aber vorher mit LOCALE_INVARIANT initialisiere.

Auszug aus der Microsoft Hilfe:
Zitat:
For example, the invariant locale is used when an application compares character strings using the CompareString function and expects a consistent result regardless of the user locale. The settings of the invariant locale are similar to those for English (United States) but should not be used to display formatted data.
Und genau das will man ja haben, wenn man z.B. einen SQL-String mit Float-Werten zusammenbauen will.

Also

Quelltext
1:
2:
3:
4:
5:
6:
7:
function FloatToSQLString(Value: Extended): string;
var
  FS: TFormatSettings;
begin
  GetLocaleFormatSettings(LOCALE_INVARIANT, FS);
  Result := FloatToStr(Value, FS);
end;


Wenn auch ein wenig spät... ich hoffe, ich konnte helfen.

TheChicken