parse c# parsing double

parse string double c#



¿Por qué double.TryParse("0.0000", out doubleValue) devuelve falso? (9)

Cuando este método retorna, contiene el número de coma flotante de doble precisión equivalente al parámetro s, si la conversión tuvo éxito, o cero si la conversión falló.

Desde la página de MSDN para este método.

http://msdn.microsoft.com/en-us/library/994c0zb1.aspx

Zero entra, cero sale.

Estoy intentando analizar la cadena "0.0000" con double.TryParse() pero no tengo idea de por qué devolvería false en este ejemplo en particular. Cuando paso cadenas de tipo entero, por ejemplo, "5", se procesa correctamente el valor de 5.

¿Alguna idea de por qué está sucediendo?


Cambiar el CultureInfo con TryParse no hizo nada por mí. Tuve que cambiar los formatos de número en el Panel de control (Cambiar, fecha, hora o formatos numéricos) y cambié el símbolo Decimal. Que funcionó de nuevo


Casi con certeza, el problema es que Thread.CurrentCulture no utiliza punto como el separador decimal.

Si sabe que el número siempre tendrá el formato de punto como separador decimal, utilice este código que utiliza Double.TryParse(String, NumberStyles, IFormatProvider, Double) de double.TryParse :

style = NumberStyles.Float | NumberStyles.AllowThousands; culture = CultureInfo.InvariantCulture; float num; if (double.TryParse("0.0000", style, culture, out num)) { // whatever }


Devolverá false si la cultura actual especifica un separador de punto decimal que es diferente de . personaje.

Al analizar la representación de cadenas, debe tener en cuenta en qué cultura están representadas; de lo contrario, obtendrá un comportamiento inesperado.

En este caso, es false , pero podría ser aún peor, por ejemplo, en el siguiente ejemplo si esperaba obtener el número uno, en cambio obtendría mil:

Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-PT"); double d; Console.WriteLine(double.TryParse("1.000", out d)); Console.WriteLine(d);

Esto es porque en la cultura pt-PT el . el carácter se usa como NumberGroupSeparator y el carácter , se usa como NumberDecimalSeparator .

Si la entrada que está analizando proviene del usuario, siempre analícela utilizando la cultura a la que está asociado el usuario. Obtener la cultura a la que está asociado el usuario es algo que depende del contexto, por ejemplo, en una aplicación de Windows Forms usaría Thread.CurrentThread.CurrentCulture cuando Thread.CurrentThread.CurrentCulture en el hilo de la interfaz de usuario para obtenerla. En una aplicación ASP.NET esto puede ser diferente.


Esto funciona para mi:

double temp = 0; Console.WriteLine(double.TryParse("0.0000", out temp)); Console.ReadLine();

escribe True .


Lo más estúpido de esto es que solo acepta "," como separador decimal en mi cultura, pero el resultado es con un ".". Alguien, en alguna parte, no tuvo mucha suerte pensando ese día ... Así que intentaré esto:

if ((double.TryParse(sVat, out vat)) == false) if (double.TryParse(sVat.Replace(",", "."), out vat) == false) double.TryParse(sVat.Replace(".", ","), out vat);


Para cambiar la cultura a algo que tiene "." como uso del separador decimal:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");


toma en cuenta la configuración de localización en tiempo de ejecución ... quizás esté ejecutando esto en un sistema donde . no es el punto decimal pero , cambio ...

En su caso específico, supongo que desea una cultura fija, independientemente del sistema con el que se esté ejecutando . como punto decimal:

double.TryParse("0.0000", NumberStyles.Number, CultureInfo.CreateSpecificCulture ("en-US"), out temp)

O

double.TryParse("0.0000", NumberStyles.Number,CultureInfo.InvariantCulture, out temp)

Algunos enlaces de referencia de MSDN:


TryParse utiliza la cultura actual de forma predeterminada. Y si su cultura actual utiliza un separador decimal diferente de . , no puede analizar 0.0000 como tu intención. Por lo tanto, debe pasar CultureInfo.InvariantCulture .

var numberStyle = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite | NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands | NumberStyles.AllowExponent;//Choose what you need double.TryParse( "0.0000", numberStyle, CultureInfo.InvariantCulture, out myVar)