Pergunta

Qual é a melhor maneira de analisar um flutuador em CSharp? Eu sei sobre TryParse, mas o que eu estou particularmente perguntando sobre é pontos, vírgulas etc.

Estou tendo problemas com meu site. No meu servidor dev, a '' é para decimais, os ''. para separador. No servidor prod, porém, é o contrário. Como posso melhor captação isso?

Foi útil?

Solução

Depende de onde a entrada é proveniente.

Se a sua entrada vem do usuário, você deve usar o CultureInfo o usuário / página está usando ( Thread.CurrentThread.CurrentUICulture ).

Você pode obter e indicação de cultura do usuário, ao olhar para o HttpRequest.UserLanguages ?? propriedade. (Não é 100% correto, mas eu achei um bom primeiro palpite) Com essa informação, você pode definir o Thread.CurrentThread.CurrentUICulture no início da página.

Se a sua entrada vem de uma fonte interna, você pode usar o InvariantCulture para analisar a cadeia.

O método Parse é um pouco mais fácil de usar, se a sua entrada é de uma fonte controlada. Isto é, você já validou a string. Parse lança uma exceção (lenta) se a sua falha.

Se a entrada não é controlada, (do usuário, ou outra fonte de Internet) a aparência TryParse melhor para mim.

Outras dicas

Eu concordo com a resposta de leppie; colocar isso em termos de código:

string s = "123,456.789";
float f = float.Parse(s, CultureInfo.InvariantCulture);

Você pode sempre usar a sobrecarga de Parse que inclui o cultura para uso?

Por exemplo:

double number = Double.Parse("42,22", new CultureInfo("nl-NL").NumberFormat); // dutch number formatting

Se você tem controle sobre todos os seus dados, você deve usar "CultureInfo.InvariantCulture" em todo o seu código.

Se você quiser persistir valores (números, data, hora, etc ...) para fins internos. Toda vez que uso "InvariantCulture" para formatação e analisar valores. "InvariantCulture" é o mesmo em cada computador, cada OS com a cultura / idioma de qualquer usuário / etc ...

string strFloat = (15.789f).ToString(System.Globalization.CultureInfo.InvariantInfo);
float numFloat  = float.Parse(System.Globalization.CultureInfo.InvariantInfo, strFloat);
string strNow   = DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantInfo);
DateTime now    = DateTime.Parse(System.Globalization.CultureInfo.InvariantInfo, strNow);

Use uma cultura neutra (ou um que você sabe) ao analisar com Try / Parse.

Passe em um CultureInfo ou NumberFormatInfo que representa a cultura que você quer analisar o flutuador como ; este controles quais caracteres são usados ??para decimais, separadores de grupos, etc.

Por exemplo, para garantir que o '. personagem foi tratado como o indicador decimal você poderia passar em CultureInfo.InvariantCulture (este é normalmente muito útil em aplicações de servidor onde você tendem a querer que as coisas sejam o mesmo, independentemente da cultura do ambiente).

Tente evitar float.Parse, use TryParse vez como ele executa muito melhor, mas faz o mesmo trabalho. isto também se aplica para o dobro, DateTime, etc ...

(alguns tipos também oferecem TryParseExact que também executa ainda melhor!)

A fonte é uma entrada a partir de um website. Eu não posso contar com ele sendo válido. Então eu fui com TryParse como mencionado antes. Mas eu não consigo descobrir como dar a CurrentCulture a ele.

Além disso, este me daria a cultura do servidor que está em execução no momento, mas já que é a world wide web, o usuário pode ser de qualquer lugar ...

Você pode saber Cuklture atual do seu servidor com uma simples declaração:

System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentCulture;

Note que existem id uma propriedade CurrentUICulture, mas UICulture é usado desde ResourceMeanager aplicativos de formulário Multilanguages. para formatação de números, você deve considère CurrentCulture.

Espero que isso irá ajudá-lo

Uma vez que você não sabe a cultura do usuário da web, você pode fazer algumas conjecturas. TryParse com uma cultura que usos, para separadores e. para decimal e TryParse com uma cultura que usos. para separadores e, para decimal. Se ambos ter sucesso, mas deu respostas diferentes, então você vai ter que perguntar ao usuário que eles pretendiam. Caso contrário, você pode prosseguir normalmente, dado seus dois resultados iguais ou um resultado útil ou não resultado utilizável.

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