Forums Neueste Beiträge
 

Localisierung zur Laufzeit / Threads

06/01/2008 - 09:30 von Rainer Queck | Report spam
Hallo NG,

ich benutze in einem aktuellen Projekt zwecks Sprachumschaltung zur Laufzeit
den von Frank Dzaebel auf in http://dzaebel.net/LocalizeRuntime.htm
aufgezeigten Weg. Dieser funktioniert bisher sehr gut.

Jetzt ist aber ein Problem auf einem Kundenrechner aufgetaucht, welches mich
etwas ràtseln làßt:
Folgende Programmzeilen führen zu der Exception "Syntax error in the
expression":

string sortStr = "koll ASC";
string selectStr = String.Format("x >= {0}", versuchsreihe.vrOmissionLevel);
sollKoll =
versuchsreihe.GetDsVersuchsreihe().tblSollKollektiv.Select(selectStr,
sortStr) as DsVersuchsreihe.tblSollKollektivRow[];

Es stellte sich heraus, dass - obwohl Thread.CurrentThread.CurrentCulture
auf en-US steht, String.Format für den selectStr "x>#,45" lieferte.
Weiter Nachforschungen ergaben, dass der Anwender in der <Systemsteuerung ->
Regions- und Sprachoptionen -> Regionale Einstellungen -> Anpassungen>
das Dezimaltrennzeichen auf ',' sowie das Symbol für Zifferngruppierung auf
'.' gestellt hatte.

Wenn ich aber mit dem Debugger bei dem Aufruf von String.Format anhalte und
mir
"Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator"
ansehe, dann steht dieser auf '.' !
Wie ist das zu erklàren? Da es sich bei meiner Anwendung um eine
multithreading Anwendung handelt, könnte es vielleicht auch um ein
multithreading Problehm handeln (!?) aber wenn mir der Debugger an dieser
Stelle die oben genannten Informationen liefert, ist das doch eher
unwahrscheinlich, oder?

Gruß
Rainer
 

Lesen sie die antworten

#1 Carl Schaffert
06/01/2008 - 11:31 | Warnen spam
Hallo Rainer,


ich benutze in einem aktuellen Projekt zwecks Sprachumschaltung zur
Laufzeit den von Frank Dzaebel auf in
http://dzaebel.net/LocalizeRuntime.htm aufgezeigten Weg. Dieser
funktioniert bisher sehr gut.

Jetzt ist aber ein Problem auf einem Kundenrechner aufgetaucht, welches
mich etwas ràtseln làßt:
Folgende Programmzeilen führen zu der Exception "Syntax error in the
expression":

string sortStr = "koll ASC";
string selectStr = String.Format("x >= {0}",
versuchsreihe.vrOmissionLevel);
sollKoll =
versuchsreihe.GetDsVersuchsreihe().tblSollKollektiv.Select(selectStr,
sortStr) as DsVersuchsreihe.tblSollKollektivRow[];

Es stellte sich heraus, dass - obwohl Thread.CurrentThread.CurrentCulture
auf en-US steht, String.Format für den selectStr "x>#,45" lieferte.
Weiter Nachforschungen ergaben, dass der Anwender in der
<Systemsteuerung -> Regions- und Sprachoptionen -> Regionale
Einstellungen -> Anpassungen>
das Dezimaltrennzeichen auf ',' sowie das Symbol für Zifferngruppierung
auf '.' gestellt hatte.

Wenn ich aber mit dem Debugger bei dem Aufruf von String.Format anhalte
und mir
"Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator"
ansehe, dann steht dieser auf '.' !
Wie ist das zu erklàren? Da es sich bei meiner Anwendung um eine
multithreading Anwendung handelt, könnte es vielleicht auch um ein
multithreading Problehm handeln (!?) aber wenn mir der Debugger an dieser
Stelle die oben genannten Informationen liefert, ist das doch eher
unwahrscheinlich, oder?



Wir kennen deinen Code nicht, daher ist es schwer dazu etwas zu sagen. Was
du machen kannst, wàre dem "String.Format" einen FormatProvider... Beispiel:

String.Format(Thread.CurrentThread.CurrentCulture, "x >= {0}",
versuchsreihe.vrOmissionLevel);

zu übergeben.
Oder du kannst auf den FormatProvider natürlich noch weiteren Einfluss
ausüben, wenn du dir ein CultureInfo-Object erstellst Beispiel:

CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
cultureInfo.NumberFormat.NumberDecimalSeparator = ".";

... und das dann string.Format übergeben:

String.Format(cultureInfo , "x >= {0}", versuchsreihe.vrOmissionLevel);

Das sollte auf jeden Fall gehen und hast jede Menge Handlungsfreiraum...
UserDefinedConfig etc. ... ;-)

Gruß Carl

Ähnliche fragen