Melhor maneira de analisar o float?

Qual é a melhor maneira de analisar um float no CSharp? Eu sei sobre TryParse, mas o que eu particularmente estou querendo saber são pontos, vírgulas etc.

Estou com problemas no meu site. No meu servidor de desenvolvimento, o ‘,’ é para decimais, o ‘.’ para separador. No servidor prod, porém, é o contrário. Como posso capturar melhor isso?

Depende de onde a input está vindo.

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

Você pode obter e indicação da cultura do usuário, observando a propriedade HttpRequest.UserLanguages . (Não está correto 100%, mas achei muito bom). Com essa informação, você pode definir o Thread.CurrentThread.CurrentUICulture no início da página.

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

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

Se a input for descontrolada, (do usuário ou outra fonte da Internet), o TryParse ficará melhor para mim.

Concordo com a resposta de leppie; para colocar isso em termos de código:

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

Você sempre pode usar a sobrecarga de Parse que inclui a cultura a ser usada?

por exemplo:

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

Se você tiver controle sobre todos os seus dados, deverá usar “CultureInfo.InvariantCulture” em todo o seu código.

Se você quiser persistir valores (números, data, hora, etc …) para fins internos. Sempre use “InvariantCulture” para formatar e analisar valores. “InvariantCulture” é o mesmo em todos os computadores, todos os sistemas operacionais com a cultura / idioma / etc de qualquer usuário …

 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 uma que você conhece) ao analisar com Try / Parse.

Passe um CultureInfo ou NumberFormatInfo que representa a cultura que você quer analisar o float como; isso controla quais caracteres são usados ​​para decimais, separadores de grupos, etc.

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

Tente evitar float.Parse, use TryParse vez como ele executa muito melhor, mas faz o mesmo trabalho. isso também se aplica a double, DateTime, etc …

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

A fonte é uma input de um site. Eu não posso confiar que seja válido. Então eu fui com TryParse como mencionado anteriormente. Mas eu não consigo descobrir como dar o currentCulture a ele.

Além disso, isso me daria a cultura do servidor que está sendo executado no momento, mas como é a Internet, o usuário pode ser de qualquer lugar …

você pode conhecer o Cuklture atual do seu servidor com uma simples declaração:

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

Observe que existe uma propriedade CurrentUICulture, mas o UICulture é usado a partir de aplicativos multilíngües do ResourceMeanager. para formatação de números, você deve considerar CurrentCulture.

Eu espero que isso te ajude

Desde que você não conhece a cultura do usuário da web, você pode fazer algumas suposições. TryParse com uma cultura que usa, para separadores e. para decimal e TryParse com uma cultura que usa. para separadores e, para decimal. Se ambos tiverem sucesso, mas renderem respostas diferentes, você terá que perguntar ao usuário o que eles pretendiam. Caso contrário, você pode prosseguir normalmente, considerando seus dois resultados iguais ou um resultado útil ou nenhum resultado utilizável.