Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   SetLocaleInfo (https://www.delphipraxis.net/212912-setlocaleinfo.html)

creehawk 23. Apr 2023 10:00

SetLocaleInfo
 
Ich muss in einem Programm in dem mehrere Gleitkommawerte bearbeitet werden für zum Beispiel die Region Schweiz den Dezimalseparator von Punkt auf Komma stellen und am Programmende natürlich wieder zurück.

Ich habe das mal so gemacht, hier noch mit der entsprechenden Anzeige was eingestellt ist und was dann eingestellt wurde, steht in der FormCreate:

Delphi-Quellcode:
 
  MyDecimal:=StrAlloc(10);
  GetLocaleInfo(LOCALE_SYSTEM_DEFAULT,LOCALE_SDECIMAL,MyDecimal,10);
  Showmessage('System decimal is: '+ MyDecimal); // aktuell ist hier ist jetzt der Punkt gesetzt

  Application.UpdateFormatSettings := True;
  SetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, ',');
  Application.UpdateFormatSettings := False;

  MyDecimal:=StrAlloc(10);
  GetLocaleInfo(LOCALE_SYSTEM_DEFAULT,LOCALE_SDECIMAL,MyDecimal,10);
  Showmessage('System decimal is: '+ MyDecimal); // aktuell ist hier ist jetzt das Komma gesetzt
Funktioniert also. Auch die händische Prüfung in den Regionseinstellungen zeigt das korrekt an. Aber das Programm nörgelt im weiteren Verlauf dann rum von wegen kein gültiger Gleitkommawert wegen dem Punkt.

Bis ich das Programm nochmal starte. Dann geht es.
Also nehme ich mal an ich muss dem Programm noch explizit Bescheid sagen.
Aber wie? Oder ist was anderes falsch?

creehawk

p.s. Es sind geschätzt 90 Änderungen die betroffen wären. Da würde würde ich mir das Stringreplace gerne sparen.

Andreas13 23. Apr 2023 10:17

AW: SetLocaleInfo
 
Hallo,
vielleicht hilft Dir die betreffende Zeile dieser Procedure zum Ändern Deiner DecimalSeparator-Einstellungen:

Delphi-Quellcode:
Procedure ConfiguraRegiaoBR; // = Original-Name
// Setzt DecimalSeparator etc.
// Quelle:
// http://stackoverflow.com/questions/25109497/decimalseparator-in-sysutils-and-system-sysutils
// von Rodrigo Garcia

Var
  WFormatoBR: TFormatSettings;

Begin
  WFormatoBR:= TFormatSettings.Create;
   
  WFormatoBR.DecimalSeparator := '.'; // ',';
  WFormatoBR.ThousandSeparator:= ','; // '.';
  WFormatoBR.CurrencyDecimals := 2;
  WFormatoBR.DateSeparator   := '/';
  WFormatoBR.ShortDateFormat := 'dd/mm/yyyy';
  WFormatoBR.LongDateFormat  := 'dd/mm/yyyy';
  WFormatoBR.TimeSeparator   := ':';
  WFormatoBR.TimeAMString    := 'AM';
  WFormatoBR.TimePMString    := 'PM';
  WFormatoBR.ShortTimeFormat := 'hh:nn';
  WFormatoBR.LongTimeFormat  := 'hh:nn:ss';
  WFormatoBR.CurrencyString  := 'R€'; // 'R$';

  System.SysUtils.FormatSettings:= WFormatoBR;
End;{Procedure ConfiguraRegiaoBR}
{-------------------------------}
Grüße
Andreas

himitsu 23. Apr 2023 12:19

AW: SetLocaleInfo
 
Wenn das Meiste einem gewissen Standard entspricht, dann einfach direkt Jenen laden und den Rest anpassen.
Delphi-Quellcode:
FormatSettings := TFormatSettings.Create('en-US'); // oder := TFormatSettings.Invariant;
FormatSettings.CurrencyString := 'R€';
de-AT ginge auch, aber muß man aufpassen, dass diese Sprache auch installiert ist. Nur wegen den Punkten kann man aber auch einfach eine vorinstallierte Sprache nutzen.


Aber anstatt global im Programm das umzustellen, vielleicht besser nur dort, wo man es wirklich braucht.
Delphi-Quellcode:
var FS := TFormatSettings.Invariant;
X := StrToFloat('123.45', FS);
Noch schlimmer, als für sein eigenes ganzes Programm, ist nur noch global am Betriebssystem rumzupfuschen, für ALLE Programme,
also Finger weg von SetLocaleInfo :!:

creehawk 24. Apr 2023 06:39

AW: SetLocaleInfo
 
Moin Moin.

Da werde ich wohl dann doch alles händisch nachbearbeiten müssen. Die Lösung von Andreas13 funktioniert, habe ich auch runtergekürzt auf die Zeile für den Decimalseperator.

d.h. : Bei Programmstart der Seperator geprüft, wenn das ein Punkt ist umgestellt auf Komma, am Programmende zurück das Ganze. Aber wenn das mal nicht klappt....

Scheibenhonig.

creehawk

himitsu 24. Apr 2023 12:49

AW: SetLocaleInfo
 
Zitat:

Zitat von creehawk (Beitrag 1521448)
Die Lösung von Andreas13 funktioniert, .... am Programmende zurück das Ganze.

FormatSettings ist nur programmintern, also Zurücksetzen nicht nötig.



Wenn du das programm-globle FormatSettings benutzt
und sich irgendwas im System ändert (z.B. zwei Mal im Jahr bei der Zeitumstellung), dann lädt die VCL das neu ... außer bei UpdateFormatSettings=False.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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