Mam taki ciąg tekstu:
var foo = "FooBar";
Chcę zadeklarować drugi wywołany ciąg bar
i uczynić go równym pierwszemu i czwartemu znakowi mojego pierwszego foo
, więc robię to w ten sposób:
var bar = foo[0].ToString() + foo[3].ToString();
Działa to zgodnie z oczekiwaniami, ale ReSharper radzi mi umieścić Culture.InvariantCulture
w nawiasach, więc ta linia kończy się tak:
var bar = foo[0].ToString(CultureInfo.InvariantCulture)
+ foo[3].ToString(CultureInfo.InvariantCulture);
Co to oznacza i czy wpłynie na sposób działania mojego programu?
Odpowiedzi:
Nie wszystkie kultury używają tego samego formatu dat i wartości dziesiętnych / walutowych.
Będzie to ważne dla ciebie, gdy jesteś przeliczania wartości wejściowych (odczyt) , które są przechowywane jako ciągi do
DateTime
,float
,double
lubdecimal
. Będzie miało również znaczenie, jeśli spróbujesz sformatować wyżej wymienione typy danych na ciągi (zapis) do wyświetlania lub przechowywania.Jeśli wiesz z wyprzedzeniem, jaka konkretna kultura, w której będą obowiązywały Twoje daty i wartości dziesiętne / walutowe, możesz użyć tej określonej
CultureInfo
właściwości (tjCultureInfo("en-GB")
.). Na przykład, jeśli oczekujesz danych wejściowych użytkownika.CultureInfo.InvariantCulture
Właściwość jest używana, jeśli formatowanie lub parsowania ciąg znaków, który powinien być parsowalnym przez kawałek oprogramowania, niezależnie od ustawień lokalnych użytkownika.Wartość domyślna to,
CultureInfo.InstalledUICulture
więc domyślna CultureInfo zależy od ustawień wykonywanego systemu operacyjnego. Dlatego zawsze powinieneś upewnić się, że informacje o kulturze pasują do twoich zamiarów (zobacz odpowiedź Martina, aby uzyskać dobrą wskazówkę).źródło
en-US
. To lokalna kultura. IInvariantCulture
jest używany, gdy chcesz mieć neutralne kulturowo formatowanie, które jest niezależne od systemu lokalnego. Na przykład podczas pracy z formatami plików opartymi na tekście.Gdy liczby, daty i godziny są formatowane w ciągi lub analizowane z ciągów, do określenia, jak to się robi, używana jest kultura. Na przykład w
en-US
kulturze dominującej masz następujące reprezentacje ciągów:W mojej kulturze (
da-DK
) wartości mają następującą reprezentację ciągu:W systemie operacyjnym Windows użytkownik może nawet dostosować formatowanie liczb i daty / czasu, a także może wybrać inną kulturę niż kultura jego systemu operacyjnego. Użyte formatowanie to wybór użytkownika, jaki powinien być.
Dlatego podczas formatowania wartości, która ma być wyświetlana użytkownikowi, za pomocą na przykład
ToString
lubString.Format
lub przeanalizowanej z ciągu przy użyciuDateTime.Parse
lub,Decimal.Parse
domyślnie jest używanaCultureInfo.CurrentCulture
. Pozwala to użytkownikowi kontrolować formatowanie.Jednak wiele formatowania i parsowania ciągów nie jest w rzeczywistości ciągami wymienianymi między aplikacją a użytkownikiem, ale między aplikacją a jakimś formatem danych (np. Plikiem XML lub CSV). W takim przypadku nie chcesz używać,
CultureInfo.CurrentCulture
ponieważ jeśli formatowanie i analizowanie są wykonywane z różnymi kulturami, może się zepsuć. W takim przypadku chcesz użyćCultureInfo.InvariantCulture
(który jest oparty naen-US
kulturze). Dzięki temu wartości mogą być przesyłane w obie strony bez problemów.Powodem, dla którego ReSharper ostrzega Cię, jest to, że niektórzy autorzy aplikacji nie są świadomi tego rozróżnienia, które może prowadzić do niezamierzonych wyników, ale nigdy tego nie odkryją, ponieważ ich zachowanie
CultureInfo.CurrentCulture
jesten-US
takie samo jakCultureInfo.InvariantCulture
. Jednak gdy tylko aplikacja zostanie użyta w innej kulturze, w której istnieje możliwość użycia jednej kultury do formatowania, a innej do analizowania, aplikacja może się zepsuć.Podsumowując:
CultureInfo.CurrentCulture
(wartość domyślna), jeśli formatujesz lub analizujesz ciąg użytkownika.CultureInfo.InvariantCulture
jeśli formatujesz lub analizujesz ciąg, który powinien być analizowany przez oprogramowanie.źródło
Decimal
zmienną zawierającą określoną wartość w dolarach amerykańskich, czy chciałbym zrobić wyjątek i użyć goen-US
jako kultury podczas wyświetlania, aby upewnić się, że nie otrzymam wyniku, który wygląda jak liczba w euro? PróbowałemCultureInfo.InvariantCulture
, ale mam to dla znacznika waluty¤
, więc nie jestem pewien, czy to właściwy sposób.CultureInfo.CurrentCulture
). Jeśli oprócz wyświetlania liczby potrzebujesz waluty, być może powinieneś to zrobić w spójny sposób, tj. Nie używającCultureInfo
a zamiast tego użyj trzyliterowego kodu waluty, takiego jakUSD 1,234.56
. Wtedy nie będziesz mieć problemów z mapowaniem waluty na kulturę.Według Microsoft:
(z http://msdn.microsoft.com/en-us/library/4c5zdc6a(vs.71).aspx )
Tak więc InvariantCulture jest podobna do kultury „en-US”, ale nie jest dokładnie taka sama. Jeśli napiszesz:
wtedy s1 i s2 będą miały podobny format, ale InvariantCulture dodaje zera wiodące, a „en-US” używa AM lub PM.
Tak więc InvariantCulture jest lepsza do użytku wewnętrznego, kiedy np. Zapisujesz datę do pliku tekstowego lub analizujesz dane. A określony CultureInfo jest lepszy, gdy przedstawiasz dane (datę, walutę ...) użytkownikowi końcowemu.
źródło
W przypadku liczb (kropki dziesiętne, przecinki w kwotach) są one zwykle preferowane w określonej kulturze.
Odpowiednim sposobem na zrobienie tego byłoby ustawienie go na poziomie kultury (dla języka niemieckiego) w następujący sposób:
źródło
JetBrains oferuje rozsądne wyjaśnienie ,
ale jeśli pracuję w witrynie, o której wiem, że będzie tylko w języku angielskim, po prostu ignoruję sugestię.
źródło