AGB  ·  Datenschutz  ·  Impressum  







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

SetLocaleInfo

Ein Thema von creehawk · begonnen am 23. Apr 2023 · letzter Beitrag vom 24. Apr 2023
Antwort Antwort
creehawk

Registriert seit: 1. Jul 2013
Ort: Hamburg
241 Beiträge
 
Delphi 10.4 Sydney
 
#1

SetLocaleInfo

  Alt 23. Apr 2023, 11:00
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.
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#2

AW: SetLocaleInfo

  Alt 23. Apr 2023, 11:17
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
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: SetLocaleInfo

  Alt 23. Apr 2023, 13:19
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (23. Apr 2023 um 13:51 Uhr)
  Mit Zitat antworten Zitat
creehawk

Registriert seit: 1. Jul 2013
Ort: Hamburg
241 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: SetLocaleInfo

  Alt 24. Apr 2023, 07:39
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: SetLocaleInfo

  Alt 24. Apr 2023, 13:49
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:48 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