Conversión de cadena a doble en C #

Tengo una cadena larga con valores de tipo doble separados por #value1#value2#value3# etc

Lo dividí en una tabla de cuerdas. Entonces, quiero convertir cada elemento de esta tabla a tipo doble y obtengo un error. ¿Qué hay de malo con la conversión de tipo aquí?

 string a = "52.8725945#18.69872650000002#50.9028073#14.971600200000012#51.260062#15.5859949000000662452.23862099999999#19.372202799999250800000045#51.7808372#19.474096499999973#"; string[] someArray = a.Split(new char[] { '#' }); for (int i = 0; i < someArray.Length; i++) { Console.WriteLine(someArray[i]); // correct value Convert.ToDouble(someArray[i]); // error } 

Hay 3 problemas.

1) separador decimal incorrecto

Las diferentes culturas usan diferentes separadores decimales (a saber , y . ).

Si reemplazas con , debería funcionar como se esperaba:

 Console.WriteLine(Convert.ToDouble("52,8725945")); 

Puedes analizar tus dobles usando un método sobrecargado que toma cultura como un segundo parámetro. En este caso, puede usar InvariantCulture ( What is invariant culture ), por ejemplo, utilizando double.Parse .

 double.Parse("52.8725945", System.Globalization.CultureInfo.InvariantCulture); 

También debería echar un vistazo a double.TryParse , puede usarlo con muchas opciones y es especialmente útil verificar si su cadena es una double válida.

2) Tienes un doble incorrecto

Uno de sus valores es incorrecto, porque contiene dos puntos:

15.5859949000000662452.23862099999999

3) Tu matriz tiene un valor vacío al final, que es un doble incorrecto

Puede usar Split sobrecargado que elimina valores vacíos:

string[] someArray = a.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries);

La mayoría de las personas ya intentaron responder tus preguntas.
Si todavía está depurando, ¿ha pensado en usar:

 Double.TryParse(String, Double); 

Esto lo ayudará a determinar qué es lo que está mal en cada una de las cadenas antes de realizar el análisis real.
Si tiene un problema relacionado con la cultura, considere usar:

 Double.TryParse(String, NumberStyles, IFormatProvider, Double); 

Este http://msdn.microsoft.com/en-us/library/system.double.tryparse.aspx tiene un muy buen ejemplo de cómo usarlos.

Si necesita una extensión larga, Int64.TryParse también está disponible: http://msdn.microsoft.com/en-us/library/system.int64.tryparse.aspx

Espero que ayude.

 private double ConvertToDouble(string s) { char systemSeparator = Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator[0]; double result = 0; try { if (s != null) if (!s.Contains(",")) result = double.Parse(s, CultureInfo.InvariantCulture); else result = Convert.ToDouble(s.Replace(".", systemSeparator.ToString()).Replace(",", systemSeparator.ToString())); } catch (Exception e) { try { result = Convert.ToDouble(s); } catch { try { result = Convert.ToDouble(s.Replace(",", ";").Replace(".", ",").Replace(";", ".")); } catch { throw new Exception("Wrong string-to-double format"); } } } return result; } 

y las pruebas aprobadas con éxito son:

  Debug.Assert(ConvertToDouble("1.000.007") == 1000007.00); Debug.Assert(ConvertToDouble("1.000.007,00") == 1000007.00); Debug.Assert(ConvertToDouble("1.000,07") == 1000.07); Debug.Assert(ConvertToDouble("1,000,007") == 1000007.00); Debug.Assert(ConvertToDouble("1,000,000.07") == 1000000.07); Debug.Assert(ConvertToDouble("1,007") == 1.007); Debug.Assert(ConvertToDouble("1.07") == 1.07); Debug.Assert(ConvertToDouble("1.007") == 1007.00); Debug.Assert(ConvertToDouble("1.000.007E-08") == 0.07); Debug.Assert(ConvertToDouble("1,000,007E-08") == 0.07); 

Agregue una clase como Public y úselo con facilidad como convertToInt32 ()

  using System; using System.Collections.Generic; using System.Linq; using System.Web; ///  /// Summary description for Common ///  public static class Common { public static double ConvertToDouble(string Value) { if (Value == null) { return 0; } else { double OutVal; double.TryParse(Value, out OutVal); if (double.IsNaN(OutVal) || double.IsInfinity(OutVal)) { return 0; } return OutVal; } } } 

Luego llame a la función

 double DirectExpense = Common.ConvertToDouble(dr["DrAmount"].ToString()); 

En su cadena veo: 15.5859949000000662452.23862099999999 que no es un doble (tiene dos decimales). Tal vez es solo un error de entrada legítimo?

Es posible que también desee averiguar si su último String estará vacío y dar cuenta de esa situación.