2012-02-21 9 views
5

ho i numeri emessi da un programma FORTRAN nel seguente formato:Come fare il parsing doppio in formato scientifico utilizzando C#

0.12961924D+01 

Come posso analizzare questo come un doppio utilizzando C#?

Ho provato quanto segue senza successo:

// 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

Penso che sarà necessario cambiare manualmente "D" in "E" e lo spazio iniziale in "-", se presente. –

+1

La notazione esponenziale che hai postato non è qualcosa che verrà riconosciuto da .NET - usa un 'E' in cui hai un' D'. – Oded

risposta

7

vorrei prima fare un po 'la manipolazione di questa stringa di ottenere da FORTRAN a .NET formattazione:

  • Tagliare qualsiasi spazio iniziale; se il segno negativo è lì, lo vogliamo ma non vogliamo spazi.
  • Sostituire "D" con "E".

Il sotto dovrebbe ottenere quello che ti serve:

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

Credo che lo spazio iniziale indichi un numero positivo; in altre parole, "usare lo spazio per indicare numeri negativi quando necessario" significa che per i numeri negativi ci sarebbe un '' -'' piuttosto che uno spazio. – phoog

+0

ah. Molto logico. Modifica ... – KeithS

+0

Ha funzionato magnificamente. Lo considero una limitazione di C# che non accetterà la 'D', ma la tua soluzione funziona perfettamente - grazie Andrew. –

1

Questo dovrebbe aiutare: s = s.Replace(' ', '-').Replace('D', 'E');

+0

Lo spazio non indica un numero negativo, è semplicemente un segnaposto per un segno negativo se necessario ... – user7116

1

Dal momento che tutti gli altri suggerisce di sostituire lo spazio con un segno meno, che sembra folle, ti offro questa soluzione un po 'più semplice:

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

Sì, anche questo funziona - grazie –