none
Codeprobleme bei verschiedenen Windowssprachen RRS feed

  • 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

    Dienstag, 31. Dezember 2019 13:51

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



    Donnerstag, 2. Januar 2020 06:17

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

    Dienstag, 31. Dezember 2019 13:56
    Moderator
  • 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.

    Mittwoch, 1. Januar 2020 19:26
  • 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



    Donnerstag, 2. Januar 2020 06:17