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?

Foi útil?

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 "")

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top