2011-10-24 20 views
11

¿Existe una manera rápida de convertir números con notación exponencial (ejemplos: "0.5e10" o "-5e20") a decimal o doble?Convertir números con notación exponencial de cadena a doble o decimal

Actualización: Encontré Parse a Number from Exponential Notation pero los ejemplos no funcionarán para mí a menos que haya especificado una cultura.

Solución:

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

Usted puede usar la siguiente: http://msdn.microsoft.com/en-us/library/system.math.exp.aspx –

+0

@Ramhound: Eso no es ideal por una serie de razones; sin mencionar que es costoso usar operaciones de punto flotante, es innecesariamente intrincado, y está diseñado para una operación x^y mucho más general donde xey son ambos reales. – Noldorin

+0

¿Has probado double.TryParse y decimal.TryParse? –

Respuesta

13

Si su cultura utiliza . como separador decimal, simplemente double.Parse("1.50E-15") debería funcionar.

Si su cultura utiliza otra cosa (por ejemplo ,) o si desea asegurarse de que su aplicación funciona de la misma en todos los equipos, se debe utilizar InvariantCulture:

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

Ya se dio cuenta de esto, pero esta fue la primera respuesta de trabajo. – OMGKurtNilsen

+5

Sí, lo noté. La próxima vez, debe publicar la solución como una respuesta y no editar la pregunta. – svick

6

Los estándares double.Parse o decimal.Parse métodos de hacer el trabajo aquí.

Ejemplos:

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

También, ver el artículo de MSDN Parsing Numeric Strings para más información. Siempre que la opción NumberStyles.AllowExponent se especifique en el método Parse (que es por defecto double), el análisis de tales cadenas funcionará bien.

NB: Como señala el interrogador, la notación exponencial de "e10", por ejemplo, no funciona en todas las culturas. Sin embargo, especificar la cultura en-US garantiza que funcione. Sospecho que CultureInfo.InvariantCulture también debería hacer el truco.

+0

Sigo recibiendo "La cadena de entrada no estaba en el formato correcto". – OMGKurtNilsen

+0

@Dylan doble prueba = doble.Parse ("1.509e10", NumberStyles.Float); // "Cadena de entrada no tiene el formato correcto." – OMGKurtNilsen

+1

Para 'decimal.Parse', necesita especificar los NumberStyles explícitamente. – Noldorin

2

@Noldorin es correcto tratar este código:

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

Gracias por confirmar. Sin embargo, esto debería ser un comentario, ya que solo está reiterando lo que hice.:-) – Noldorin

+0

Sé que originalmente agregué como comentario, pero luego me di cuenta de que no se podía poner un bloque de código en un comentario –

+0

Sin preocupaciones. No dude en editar mi respuesta, después de todo (tiene el privilegio en su representante, ¿sí?). Si no, el ejemplo está allí ahora. Probablemente los agregamos al mismo tiempo. – Noldorin

0

la Math.Round lo hace bien, será Reder el número para que se retire, aquí es cómo usarlo:

Math.Round(Double.Parse("3,55E-15"),2) 
Cuestiones relacionadas