2012-02-21 18 views
5

tengo los números emitidos desde un programa FORTRAN en el siguiente formato:Cómo analizar doble en formato científico utilizando C#

0.12961924D+01 

¿Cómo puedo analizar esto como una doble C usando #?

He intentado lo siguiente sin éxito:

// note leading space, FORTRAN pads its output so that positive and negative 
// numbers are the same string length 
string s = " 0.12961924D+01"; 
double v1 = Double.Parse(s) 
double v2 = Double.Parse(s, NumberStyles.Float) 
+0

Creo que tendrá que cambiar manualmente 'D' a 'E' y el espacio inicial a '-', si está presente. –

+1

La notación exponencial que publicaste no es algo que sea reconocido por .NET - usa una 'E' donde tienes una' D'. – Oded

Respuesta

7

quisiera en primer lugar hacer un poco de manipulación de esta cadena para obtener de FORTRAN a .NET formatear:

  • Recorta cualquier espacio delantero; si el signo negativo está allí, lo queremos pero no queremos espacios.
  • Reemplace "D" con "E".

La continuación deben conseguir lo que necesita:

string s = " 0.12961924D+01"; 
s = s.Trim().Replace("D", "E"); 
//s should now look like "0.12961924E01"  
double v2 = Double.Parse(s, NumberStyles.Float); 
+1

Creo que el espacio inicial indica un número positivo; en otras palabras, "usar el espacio para indicar números negativos cuando sea necesario" significa que para los números negativos habría un ''-'' en lugar de un espacio. – phoog

+0

ah. Muy lógico Editando ... – KeithS

+0

Funcionó maravillosamente. Considero una limitación de C# que no aceptará la 'D', pero su solución funciona perfectamente, gracias Andrew. –

1

Esto debería ayudar: s = s.Replace(' ', '-').Replace('D', 'E');

+0

El espacio no indica un número negativo, es simplemente un marcador de posición para un signo negativo si es necesario ... – user7116

1

Dado que todos los demás sugiere reemplazar el espacio con un signo menos, lo que parece una locura, voy a ofrecer esta solución algo más simple:

string input = " 0.12961924D+01"; 
double output = Double.Parse(s.Replace('D', 'E')); 
+0

Sí, esto también funciona, gracias –