Eu tenho uma sequência de texto assim:
var foo = "FooBar";
Quero declarar uma segunda string chamada bar
e torná-la igual ao primeiro e quarto caracteres do meu primeiro foo
, então faço assim:
var bar = foo[0].ToString() + foo[3].ToString();
Isso funciona como esperado, mas o ReSharper está me aconselhando a colocar Culture.InvariantCulture
dentro dos meus colchetes, então essa linha acaba assim:
var bar = foo[0].ToString(CultureInfo.InvariantCulture)
+ foo[3].ToString(CultureInfo.InvariantCulture);
O que isso significa e afetará a execução do meu programa?
Respostas:
Nem todas as culturas usam o mesmo formato para datas e valores decimais / moeda.
Isso importa para você quando você está convertendo os valores de entrada (ler) que são armazenados como cordas para
DateTime
,float
,double
oudecimal
. Também será importante se você tentar formatar os tipos de dados mencionados acima em seqüências de caracteres (gravação) para exibição ou armazenamento.Se você souber em qual cultura específica suas datas e valores decimais / moeda serão antecipados, poderá usar essa
CultureInfo
propriedade específica (por exemploCultureInfo("en-GB")
). Por exemplo, se você espera uma entrada do usuário.A
CultureInfo.InvariantCulture
propriedade é usada se você estiver formatando ou analisando uma sequência que deve ser analisada por um software independente das configurações locais do usuário.O valor padrão é
CultureInfo.InstalledUICulture
que o CultureInfo padrão depende das configurações do sistema operacional em execução. É por isso que você deve sempre garantir que as informações da cultura sejam adequadas à sua intenção (consulte a resposta de Martin para obter uma boa orientação).fonte
en-US
. É a cultura local. EInvariantCulture
é usado quando você deseja formatação neutra para a cultura, independente do sistema local. Por exemplo, ao trabalhar com formatos de arquivo baseados em texto.Quando números, datas e horas são formatados em cadeias ou analisados a partir de cadeias, uma cultura é usada para determinar como isso é feito. Por exemplo, na
en-US
cultura dominante , você tem estas representações de string:Na minha cultura (
da-DK
), os valores têm esta representação em cadeia:No sistema operacional Windows, o usuário pode até personalizar como os números e a data / hora são formatados e também pode escolher outra cultura além da cultura do sistema operacional. A formatação utilizada é a escolha do usuário, como deve ser.
Portanto, quando você formata um valor a ser exibido ao usuário usando, por exemplo,
ToString
ouString.Format
ou analisado uma string usandoDateTime.Parse
ouDecimal.Parse
o padrão é usar oCultureInfo.CurrentCulture
. Isso permite que o usuário controle a formatação.No entanto, muitas formatações e análises de strings não são trocadas entre o aplicativo e o usuário, mas entre o aplicativo e alguns formatos de dados (por exemplo, um arquivo XML ou CSV). Nesse caso, você não deseja usá-lo
CultureInfo.CurrentCulture
porque, se a formatação e a análise forem feitas com diferentes culturas, elas poderão quebrar. Nesse caso, você deseja usarCultureInfo.InvariantCulture
(que é baseado naen-US
cultura). Isso garante que os valores possam percorrer sem problemas.O motivo pelo qual o ReSharper avisa é que alguns criadores de aplicativos desconhecem essa distinção, o que pode levar a resultados indesejados, mas eles nunca descobrem isso porque
CultureInfo.CurrentCulture
são elesen-US
que têm o mesmo comportamentoCultureInfo.InvariantCulture
. No entanto, assim que o aplicativo é usado em outra cultura, existe a chance de usar uma cultura para formatação e outra para analisar o aplicativo.Então, para resumir:
CultureInfo.CurrentCulture
(o padrão) se você estiver formatando ou analisando uma sequência de caracteres do usuário.CultureInfo.InvariantCulture
se você estiver formatando ou analisando uma sequência que deve ser analisada por um software.fonte
Decimal
variável que contenha um determinado valor em dólares americanos, gostaria de fazer uma exceção e usaren-US
como cultura ao exibi-la para garantir que não obtenho um resultado que se pareça com um número em euros? Eu tenteiCultureInfo.InvariantCulture
, mas consegui isso para o marcador de moeda¤
, então não tenho certeza de que é o caminho certo.CultureInfo.CurrentCulture
). Se você, além de exibir um número, precisar da moeda, talvez faça isso de maneira consistente, ou seja, sem usar umCultureInfo
e, em vez disso, use o código de moeda de três letras comoUSD 1,234.56
. Então você não entra em problemas de mapear uma moeda para uma cultura.De acordo com a Microsoft:
(em http://msdn.microsoft.com/en-us/library/4c5zdc6a(vs.71).aspx )
Portanto, a InvariantCulture é semelhante à cultura "en-US", mas não é exatamente a mesma. Se você escrever:
então s1 e s2 terão formato semelhante, mas InvariantCulture adiciona zeros à esquerda e "en-US" usa AM ou PM.
Portanto, InvariantCulture é melhor para uso interno, quando você salva uma data em um arquivo de texto ou analisa dados. E um CultureInfo especificado é melhor quando você apresenta dados (data, moeda ...) para o usuário final.
fonte
Para coisas como números (casas decimais, vírgulas em quantidades), elas geralmente são preferidas na cultura específica.
Uma maneira apropriada de fazer isso seria configurá-lo no nível da cultura (para alemão) assim:
fonte
O JetBrains oferece uma explicação razoável ,
mas se estou trabalhando em um site que sei que será apenas em inglês, simplesmente ignoro a sugestão.
fonte