poonam
poonam

Reputation: 810

Delphi decimal separator issue

My application works on system with regional settings where decimal separator is comma. (Delphi 10.1)

I have set dot as decimal separator for my application .

  Application.UpdateFormatSettings := false;
  FormatSettings.DecimalSeparator := '.';
  Application.UpdateFormatSettings := true;

This works fine for me.

I have used format('%6.3f', 125.365]) function. Exe is on for 24*7 on the system..

In the initial phase like 1 or 2 hours format function returns data properly with dot as decimal separator but later on it changes to local settings comma

say 12,365.

How does dot changes to comma suddenly?

Upvotes: 3

Views: 20790

Answers (3)

mostafa toloo
mostafa toloo

Reputation: 61

get the local format setting and change it.

var
  fs:TFormatSettings;
begin
    fs:=TFormatSettings.Create(GetThreadLocale());
    GetLocaleFormatSettings(GetThreadLocale(),fs);
    fs.DecimalSeparator:='.';
end

Upvotes: 3

Rudy Velthuis
Rudy Velthuis

Reputation: 28806

Do not rely on the global FormatSettings. Use the second overload of Format, which allows you to specify your own TFormatSettings.

If you have a newer version of Delphi, you can directly use TFormatSettings.Invariant:

S := Format('%6.3f', [125.365], TFormatSettings.Invariant)

Or you create a new TFormatSettings:

S := Format('%6.3f', [125.365], TFormatSettings.Create('en-US'));

Or, e.g. in a version that does not have the Invariant or Create methods, you can set the values "by hand", of course. But set them in your own FormatSettings, not in the global one.

Upvotes: 7

Johan
Johan

Reputation: 76567

If you don't want people to mess with your stuff, use the kragle.
In this case it is an overload version of Format that accepts a FormatSettings record.

Create a unit like so:

unit DecimalPoint;

interface

uses
  System.SysUtils;

var fs: TFormatSettings;

implementation
initialization
  fs:= FormatSettings;
  fs.ThousandSeparator:= ' ';  <<-- don't forget
  fs.DecimalSeparator:= '.'
end.

And add this unit to the uses where needed.

Now use it like so:

Str:= Format('%6.3f', 125.365],fs);

Upvotes: 0

Related Questions