Ich habe eine Textfolge wie folgt:
var foo = "FooBar";
Ich möchte eine zweite Zeichenfolge mit dem Namen deklarieren bar
und dies gleich dem ersten und vierten Zeichen meines ersten Zeichens machen foo
, also mache ich das so:
var bar = foo[0].ToString() + foo[3].ToString();
Dies funktioniert wie erwartet, aber ReSharper rät mir, Culture.InvariantCulture
in meine Klammern zu setzen , sodass diese Zeile wie folgt endet:
var bar = foo[0].ToString(CultureInfo.InvariantCulture)
+ foo[3].ToString(CultureInfo.InvariantCulture);
Was bedeutet das und wird es sich auf die Ausführung meines Programms auswirken?
Antworten:
Nicht alle Kulturen verwenden dasselbe Format für Datumsangaben und Dezimal- / Währungswerte.
Dies wird für Sie relevante, wenn Sie Eingabewerte konvertieren (Lesen) , die als Strings gespeichert sind
DateTime
,float
,double
oderdecimal
. Es ist auch wichtig, wenn Sie versuchen, die oben genannten Datentypen zur Anzeige oder Speicherung in Zeichenfolgen (Schreiben) zu formatieren .Wenn Sie im Voraus wissen, in welcher bestimmten Kultur sich Ihre Daten und Dezimal- / Währungswerte befinden, können Sie diese bestimmte
CultureInfo
Eigenschaft (dhCultureInfo("en-GB")
) verwenden. Zum Beispiel, wenn Sie eine Benutzereingabe erwarten.Die
CultureInfo.InvariantCulture
Eigenschaft wird verwendet, wenn Sie eine Zeichenfolge formatieren oder analysieren, die von einer Software unabhängig von den lokalen Einstellungen des Benutzers analysiert werden soll.Der Standardwert ist
CultureInfo.InstalledUICulture
so, dass die Standard-CultureInfo von den Einstellungen des ausführenden Betriebssystems abhängt. Aus diesem Grund sollten Sie immer sicherstellen, dass die Kulturinformationen Ihrer Absicht entsprechen ( eine gute Richtlinie finden Sie in Martins Antwort ).quelle
en-US
. Es ist die lokale Kultur. UndInvariantCulture
wird verwendet, wenn Sie eine kulturneutrale Formatierung wünschen, die vom lokalen System unabhängig ist. Zum Beispiel bei der Arbeit mit textbasierten Dateiformaten.Wenn Zahlen, Datums- und Uhrzeitangaben in Zeichenfolgen formatiert oder aus Zeichenfolgen analysiert werden, wird eine Kultur verwendet, um zu bestimmen, wie dies erfolgt. ZB in der dominanten
en-US
Kultur haben Sie diese String-Darstellungen:In meiner Kultur (
da-DK
) haben die Werte diese Zeichenfolgendarstellung:Im Windows-Betriebssystem kann der Benutzer sogar die Formatierung von Zahlen und Datum / Uhrzeit anpassen und eine andere Kultur als die Kultur seines Betriebssystems auswählen. Die verwendete Formatierung ist die Wahl des Benutzers, wie es sein sollte.
Also , wenn Sie einen Wert formatieren , um den Benutzer angezeigt werden , indem zum Beispiel
ToString
oderString.Format
oder aus einer Zeichenfolge analysiert unter Verwendung vonDateTime.Parse
oderDecimal.Parse
der Standard ist das verwendenCultureInfo.CurrentCulture
. Dadurch kann der Benutzer die Formatierung steuern.Bei vielen Formatierungen und Analysen von Zeichenfolgen werden jedoch keine Zeichenfolgen zwischen der Anwendung und dem Benutzer ausgetauscht, sondern zwischen der Anwendung und einem bestimmten Datenformat (z. B. einer XML- oder CSV-Datei). In diesem Fall möchten Sie nicht verwenden,
CultureInfo.CurrentCulture
da das Formatieren und Parsen mit verschiedenen Kulturen unterbrochen werden kann. In diesem Fall möchten Sie verwendenCultureInfo.InvariantCulture
(was auf deren-US
Kultur basiert ). Dies stellt sicher, dass die Werte problemlos umrunden können.Der Grund , dass ReSharper gibt Ihnen die Warnung ist , dass einige Anwendungs Autoren nicht bewusst diese Unterscheidung sind die zu unerwünschten Ergebnissen führen kann , aber sie nie entdecken , weil sie
CultureInfo.CurrentCulture
heißt ,en-US
die als das gleiche Verhalten hatCultureInfo.InvariantCulture
. Sobald die Anwendung jedoch in einer anderen Kultur verwendet wird, in der die Möglichkeit besteht, eine Kultur zum Formatieren und eine andere zum Parsen zu verwenden, kann die Anwendung unterbrochen werden.Um es zusammenzufassen:
CultureInfo.CurrentCulture
(Standardeinstellung), wenn Sie eine Benutzerzeichenfolge formatieren oder analysieren.CultureInfo.InvariantCulture
Sie diese Option, wenn Sie eine Zeichenfolge formatieren oder analysieren, die von einer Software analysiert werden soll.quelle
Decimal
Variable habe, die einen bestimmten Wert in US-Dollar enthält, möchte ich dann eine Ausnahme machen unden-US
als Kultur verwenden, wenn ich sie anzeige, um sicherzustellen, dass ich kein Ergebnis erhalte, das wie eine Zahl in Euro aussieht? Ich habe es versuchtCultureInfo.InvariantCulture
, habe es aber für den Währungsmarker bekommen¤
, daher bin ich mir nicht sicher, ob das der richtige Weg ist.CultureInfo.CurrentCulture
. B. Verwendung ). Wenn Sie zusätzlich zur Anzeige einer Zahl die Währung benötigen, sollten Sie dies möglicherweise auf konsistente Weise tun, dh nicht a verwendenCultureInfo
und stattdessen den dreistelligen Währungscode wie verwendenUSD 1,234.56
. Dann geraten Sie nicht in die Probleme, eine Währung einer Kultur zuzuordnen.Laut Microsoft:
(von http://msdn.microsoft.com/en-us/library/4c5zdc6a(vs.71).aspx )
InvariantCulture ähnelt also der Kultur "en-US", ist aber nicht genau dasselbe. Wenn Sie schreiben:
dann haben s1 und s2 das gleiche Format, aber InvariantCulture fügt führende Nullen hinzu und "en-US" verwendet AM oder PM.
InvariantCulture ist also besser für den internen Gebrauch geeignet, wenn Sie beispielsweise ein Datum in einer Textdatei speichern oder Daten analysieren. Und eine bestimmte CultureInfo ist besser, wenn Sie dem Endbenutzer Daten (Datum, Währung ...) präsentieren.
quelle
Für Dinge wie Zahlen (Dezimalstellen, Kommas in Beträgen) werden sie normalerweise in der spezifischen Kultur bevorzugt.
Ein geeigneter Weg, dies zu tun, wäre, es auf kultureller Ebene (für Deutsch) wie folgt einzustellen:
quelle
JetBrains bieten eine vernünftige Erklärung ,
Wenn ich jedoch an einer Website arbeite, von der ich weiß, dass sie nur auf Englisch verfügbar ist, ignoriere ich den Vorschlag einfach.
quelle