Benutzer mit den meisten Antworten
Codeprobleme bei verschiedenen Windowssprachen

Frage
-
Hallo,
allen einen guten Rutsch schonmal. Ich habe ein Problem mit 2 Windowssprachen. Mein kleines Programm läuft einwandfrei auf einem deutschen Betriebssystem, allerdings macht es Fehler in der internen Berechnung bei einem englischem Betriebssystem. Das Problem ist, dass wir im deutschen mit "," berechnen, aber im englischem mit "." . Ich habe das Problem nur umgangen, indem ich die Berechnung für deutsch und englisch umgeschrieben habe. Gibt es da auch noch eine universellere Lösung für mein Problem als dieses mit einer if/switch Funktion zu trennen?
Mit freundlichen Grüßen
Iso Sek
Antworten
-
Hi,
wenn Du keine explizite Konvertierung der Ein- und Ausgaben vornimmst, dann werden die Einstellungen des Betriebssystems genutzt. Wenn also ein Deutscher sein Betriebssystem auf "englisch" eingestellt hat, dann wird bei dieser impliziten Konvertierung der Punkt als Dezimaltrenner genutzt. Die Eingabe von "1,234" ergibt dann 1234. Die Ausgabe des Wertes 1/8 ergibt dann "0.125".Wenn also das Programm mit unterschiedlichen Spracheinstellungen genutzt werden soll, ist zu entscheiden, ob generell bei Ein- und Ausgaben die Einstellungen des Betriebssystems zur Konvertierung genutzt werden sollen oder, ob davon abgewichen werden soll. Z.B. kann man dem Anwender eine Auswahl bereitstellen, mit der er die im Programm zur Konvertierung genutzte Kultur auswählt. Nach dieser Auswahl wird im Programm die Culture und UICulture neu gesetzt und die implizite Typkonvertierung nutzt diese Einstellungen.
Für den Datenaustausch kann es erforderlich sein, dass Werte unabhängig von den Einstellungen des Betriebssystem in Textform übergeben werden. In diesem Fall ist es üblich, die invariante Kultur zu nutzen. Das ist die angelsächsische Kultur mit Punkt als Dezimaltrenner. Für das Einlesen und Ausgeben dieser Zeichenketten muss dann explizit die Typkonvertierung durchgeführt werden. Dazu bieten die Konvertierungsmethoden Überladungen an, bei denen als zusätzlicher Parameter die für die Konvertierung zu nutzende Kultur angegeben werden kann.
Test mal die folgende Konsolendemo:
using System; using System.Globalization; using System.Threading; namespace ConsoleApp1 { class Program17 { static void Main(string[] args) { try { (new Demo()).Execute(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.WriteLine("Continue enter key"); Console.ReadKey(); } internal class Demo { internal void Execute() { // implizite Konvertierung string s1In = "1.234"; double d1 = double.Parse(s1In); string s1Out = d1.ToString(); Console.WriteLine(s1Out); // string s2In = "1,234"; double d2 = double.Parse(s2In); string s2Out = d2.ToString(); Console.WriteLine(s2Out); // explizite Konvertierung string s3In = "1.234"; double d3 = double.Parse(s3In, CultureInfo.InvariantCulture); string s3Out = d3.ToString(); Console.WriteLine(s3Out); // string s4In = "1.234"; double d4 = double.Parse(s4In, CultureInfo.InvariantCulture); string s4Out = d4.ToString(CultureInfo.InvariantCulture); Console.WriteLine(s4Out); // in einer anderen Kultur weiterarbeiten Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-us"); Thread.CurrentThread.CurrentUICulture= CultureInfo.GetCultureInfo("en-us"); string s5In = "1.234"; double d5 = double.Parse(s5In); string s5Out = d5.ToString(); Console.WriteLine(s5Out); Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("de-de"); Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de-de"); Console.WriteLine(d5.ToString()); } } } }
--
Best Regards / Viele Grüße
Peter Fleischer (former MVP for Developer Technologies)
Homepage, Tipps, Tricks
- Bearbeitet Peter Fleischer Donnerstag, 2. Januar 2020 06:24
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 6. Januar 2020 07:48
- Als Antwort markiert Isosek Mittwoch, 8. Januar 2020 15:40
Alle Antworten
-
Hi,
berechnet wird immer mit Punkt, nur die Darstellung ist ggfs. anders.
Ohne deinen Code und die Fehlermeldungen zu kennen, kann man dir aber leider nicht weiterhelfen.
Daher: Poste bitte deinen Code.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport -
Ich habe mich falsch ausgedrückt. Ich habe 14 Eingabefelder, in denen man 2 Nachkommastellen einfügen kann. Wir Deutschen schreiben das ja am liebsten mit "," und andere auch, allerdings wird die Berechung falsch erstellt, wenn man auf einem englischen Betriebssystem ein "," macht und umgekehrt mit "." auf dem deutschen Betriebssystem.
Bitte Entschuldige die falsche Beschreibung.
-
Hi,
wenn Du keine explizite Konvertierung der Ein- und Ausgaben vornimmst, dann werden die Einstellungen des Betriebssystems genutzt. Wenn also ein Deutscher sein Betriebssystem auf "englisch" eingestellt hat, dann wird bei dieser impliziten Konvertierung der Punkt als Dezimaltrenner genutzt. Die Eingabe von "1,234" ergibt dann 1234. Die Ausgabe des Wertes 1/8 ergibt dann "0.125".Wenn also das Programm mit unterschiedlichen Spracheinstellungen genutzt werden soll, ist zu entscheiden, ob generell bei Ein- und Ausgaben die Einstellungen des Betriebssystems zur Konvertierung genutzt werden sollen oder, ob davon abgewichen werden soll. Z.B. kann man dem Anwender eine Auswahl bereitstellen, mit der er die im Programm zur Konvertierung genutzte Kultur auswählt. Nach dieser Auswahl wird im Programm die Culture und UICulture neu gesetzt und die implizite Typkonvertierung nutzt diese Einstellungen.
Für den Datenaustausch kann es erforderlich sein, dass Werte unabhängig von den Einstellungen des Betriebssystem in Textform übergeben werden. In diesem Fall ist es üblich, die invariante Kultur zu nutzen. Das ist die angelsächsische Kultur mit Punkt als Dezimaltrenner. Für das Einlesen und Ausgeben dieser Zeichenketten muss dann explizit die Typkonvertierung durchgeführt werden. Dazu bieten die Konvertierungsmethoden Überladungen an, bei denen als zusätzlicher Parameter die für die Konvertierung zu nutzende Kultur angegeben werden kann.
Test mal die folgende Konsolendemo:
using System; using System.Globalization; using System.Threading; namespace ConsoleApp1 { class Program17 { static void Main(string[] args) { try { (new Demo()).Execute(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.WriteLine("Continue enter key"); Console.ReadKey(); } internal class Demo { internal void Execute() { // implizite Konvertierung string s1In = "1.234"; double d1 = double.Parse(s1In); string s1Out = d1.ToString(); Console.WriteLine(s1Out); // string s2In = "1,234"; double d2 = double.Parse(s2In); string s2Out = d2.ToString(); Console.WriteLine(s2Out); // explizite Konvertierung string s3In = "1.234"; double d3 = double.Parse(s3In, CultureInfo.InvariantCulture); string s3Out = d3.ToString(); Console.WriteLine(s3Out); // string s4In = "1.234"; double d4 = double.Parse(s4In, CultureInfo.InvariantCulture); string s4Out = d4.ToString(CultureInfo.InvariantCulture); Console.WriteLine(s4Out); // in einer anderen Kultur weiterarbeiten Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-us"); Thread.CurrentThread.CurrentUICulture= CultureInfo.GetCultureInfo("en-us"); string s5In = "1.234"; double d5 = double.Parse(s5In); string s5Out = d5.ToString(); Console.WriteLine(s5Out); Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("de-de"); Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de-de"); Console.WriteLine(d5.ToString()); } } } }
--
Best Regards / Viele Grüße
Peter Fleischer (former MVP for Developer Technologies)
Homepage, Tipps, Tricks
- Bearbeitet Peter Fleischer Donnerstag, 2. Januar 2020 06:24
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 6. Januar 2020 07:48
- Als Antwort markiert Isosek Mittwoch, 8. Januar 2020 15:40