Reputation: 810
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
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
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
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