problema Internacionalização - Double.Parse
-
05-09-2019 - |
Pergunta
Isso está me deixando louco. Eu tenho a seguinte seqüência de caracteres em um ASP.NET 2.0 WebForm página
string s = "0.009";
bastante simples. Agora, se minha cultura é o espanhol - que é "es-ES" - e eu tento converter a cadeia para Double, eu faço o seguinte:
double d = Double.Parse(s, new CultureInfo("es-ES"));
o que eu esperaria é 0,009. Em vez disso, eu recebo 9. Entendo que .NET pensa que é um separador de milhar, que em pt-BR é uma vírgula, mas não deve demorar a informação cultura eu estou passando para o método de análise e aplicar o formato correto a conversão?
Se eu fizer
double d = 0.009D;
string formatted = d.ToString(new CultureInfo("es-ES"));
formatado é agora 0,009. Qualquer um?
Solução
é tomando a cultura que você deu e aplicar a formatação correta. Você forneceu uma série de "0.009" e disse que ele era espanhol ... então você se queixam de que ele interpretou corretamente como espanhol! Não diga a ele que a corda é o espanhol quando você sabe que não é.
Você deve passar o método Parse a cultura da corda que está sendo analisado, que neste caso seria en-US ou en-GB ou InvariantCulture.
Outras dicas
o que a escrita de Jess trabalha para mim. apenas para quem tinha necessidade de tentar descobrir como obter "cultura invariável": parece este
double d = Double.Parse(myString, CultureInfo.InvariantCulture);
(primeiro post stackoverflow, então sim, bastante marginal;) ??
Você tem isso para trás.
Quando você diz double d = Double.Parse(s, new CultureInfo("es-ES"));
, você está pedindo .NET para analisar a seqüência em um casal, assumindo que a corda está escrito na cultura es-ES.
Na cultura espanhola "" é um separador de milhares, por isso "0,009" é 9.
Quando você converte usando ToString (), no final, ele está dizendo convertido 0,009 para uma string usando a cultura espanhola, para que ele usa "" como separador decimal, e você terá '0009'. O comportamento é correto.
Meu palpite é que você quer usar Double.Parse com a cultura invariável, e ToString com a cultura espanhola, por isso torna-se 0,009 0,009.
Eu acho que você está interpretando o caminho errado ao redor, em es-ES cultura 0,009 é realmente apenas um longo caminho de dizer 9, como o "". não é o separador decimal, por isso, se você perguntar para a string "0,009" para ser analisado com a cultura es-ES você deve realmente obter o deouble 9.0. Se você pedir para ele analisar "0009" você deve ter uma dupla de 0,009.
Se você pedir para ele formato a dupla 0,009 você deve obter a string "0009" no es-ES.
Você está confundindo análise e formatação. Você ganha 9 em vez de 0,009 pela primeira vez porque você toma uma cadeia que é formatado em uma cultura baseada em. E analisá-lo usando, uma cultura baseada. Você precisa analisá-lo usando qualquer cultura foi criada com e, em seguida, formatá-lo usando qualquer cultura que você quer para exibição.
double d = Double.Parse("0,009",
NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands,
CultureInfo.CreateSpecificCulture("es-ES"));
Na cultura es-ES "" é um seporator decimal (não "")