2011-10-24 19 views
11

C'è un modo rapido per convertire numeri con notazione esponenziale (esempi: "0.5e10" o "-5e20") in decimale o doppio?Convertire numeri con notazione esponenziale da stringa a doppia o decimale

Aggiornamento: Ho trovato Parse a Number from Exponential Notation ma gli esempi non funzioneranno per me a meno che non abbia specificato una cultura.

Soluzione:

double test = double.Parse("1.50E-15", CultureInfo.InvariantCulture); 
+0

è possibile utilizzare il seguente: http://msdn.microsoft.com/en-us/library/system.math.exp.aspx –

+0

@ Ramon: questo non è l'ideale per una serie di motivi; per non parlare delle costose operazioni in virgola mobile, è inutilmente complicato, ed è progettato per un'operazione molto più generale x^y dove x e y sono entrambi reali. – Noldorin

+0

Hai provato a double.TryParse e decimal.TryParse? –

risposta

13

Se la vostra cultura usa . come separatore decimale, basta double.Parse("1.50E-15") dovrebbe funzionare.

Se la vostra cultura usa qualcosa di diverso (ad es ,) o si desidera assicurarsi che l'applicazione funziona allo stesso modo su ogni computer, è necessario utilizzare InvariantCulture:

double.Parse("1.50E-15", CultureInfo.InvariantCulture) 
+0

Lo abbiamo già capito, ma questa è stata la prima risposta operativa. – OMGKurtNilsen

+5

Sì, ho notato. La prossima volta, devi pubblicare la soluzione come risposta e non modificare la domanda. – svick

6

Lo standard double.Parse o decimal.Parse metodi di fare il lavoro qui.

Esempi:

// AllowExponent is implicit 
var number1 = double.Parse("0.5e10"); 
Debug.Assert(number1 == 5000000000.0); 

// AllowExponent must be given explicitly 
var number2 = decimal.Parse("0.5e10", NumberStyles.AllowExponent); 
Debug.Assert(number2 == 5000000000m); 

Inoltre, vedere l'articolo di MSDN Parsing Numeric Strings per ulteriori informazioni. Finché l'opzione NumberStyles.AllowExponent è specificata nel metodo Parse (che è l'impostazione predefinita per double), l'analisi di tali stringhe funzionerà correttamente.

NB: Come sottolinea l'interrogante, la notazione esponenziale di "e10", ad esempio, non funziona in tutte le culture. Specificando la cultura en-US, tuttavia, si assicura che funzioni. Sospetto che anche lo CultureInfo.InvariantCulture dovrebbe fare il trucco.

+0

Continuo a ricevere "La stringa di input non era in un formato corretto". – OMGKurtNilsen

+0

@Dylan double test = double.Parse ("1.509e10", NumberStyles.Float); // "La stringa di input non era in un formato corretto." – OMGKurtNilsen

+1

Per 'decimal.Parse' è necessario specificare gli stili di numero esplicitamente. – Noldorin

2

@Noldorin è corretto provare questo codice:

string str = "-5e20"; 
double d = double.Parse(str); 
Console.WriteLine(str); 
+2

Grazie per la conferma. Questo probabilmente dovrebbe essere un commento, visto che sta solo ripetendo quello che ho fatto.:-) – Noldorin

+0

So che inizialmente ho aggiunto come commento ma poi mi sono reso conto che non si poteva inserire un blocco di codice in un commento –

+0

Nessun problema. Sentiti libero di modificare la mia risposta, dopo tutto (hai il privilegio del tuo rappresentante sì?). In caso contrario, l'esempio è lì ora. Probabilmente li abbiamo aggiunti allo stesso tempo. – Noldorin

0

il Math.Round lo fa bene, sarà Reder il numero in modo che rimuoverà, ecco come usarlo:

Math.Round(Double.Parse("3,55E-15"),2) 
Problemi correlati