visual separador salida que parse numero moneda miles formato decimales dar convertir c# .net number-formatting exponent

c# - separador - Analizar un número de notación exponencial



que es parse en visual basic (7)

Necesito analizar la cadena "1.2345E-02" (un número expresado en notación exponencial) a un tipo de datos decimales, pero Decimal.Parse("1.2345E-02") simplemente arroja un error


Además de especificar NumberStyles, recomendaría que use la función decimal.TryParse , como:

decimal result; if( !decimal.TryParse("1.2345E-02", NumberStyles.Any, CultureInfo.InvariantCulture, out result) ) { // do something in case it fails? }

Como alternativa a NumberStyles. Cualquiera puede usar un conjunto específico si está seguro de sus formatos. p.ej:

NumberStyles.AllowExponent | NumberStyles.Float


Advertencia sobre el uso de NumberStyles.Any:

"6.33E + 03" se convierte a 6330 como se esperaba. En alemán, los puntos decimales están representados por comas, ¡pero 6,33E + 03 se convierte en 633000! Este es un problema para mis clientes, ya que la cultura que genera los datos no se conoce y puede ser diferente de la cultura que opera en los datos. En mi caso, siempre tengo notación científica, así que siempre puedo reemplazar la coma por el punto decimal antes de analizar, pero si trabajas con números arbitrarios, como números bonitos con formato como 1,234,567, entonces ese enfoque no funciona.


Es un número de coma flotante, debes decirle que:

decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float);


Funciona si especifica NumberStyles.Float :

decimal x = decimal.Parse("1.2345E-02", NumberStyles.Float); Console.WriteLine(x); // Prints 0.012345

No estoy del todo seguro de por qué esto no es compatible por defecto: el valor predeterminado es usar NumberStyles.Number , que usa los estilos AllowLeadingWhite, AllowTrailingWhite, AllowLeadingSign, AllowTrailingSign, AllowDecimalPoint y AllowThousands. Posiblemente esté relacionado con el desempeño; Especificar un exponente es relativamente raro, supongo.


He encontrado que al pasar en NumberStyles.Float , en algunos casos, cambia las reglas por las que se procesa la cadena y da como resultado una salida diferente de NumberStyles.Number (las reglas predeterminadas utilizadas por decimal.Parse ).

Por ejemplo, el siguiente código generará una FormatException en mi máquina:

CultureInfo culture = new CultureInfo(""); culture.NumberFormat.NumberDecimalDigits = 2; culture.NumberFormat.NumberDecimalSeparator = "."; culture.NumberFormat.NumberGroupSeparator = ","; Decimal.Parse("1,234.5", NumberStyles.Float, culture); // FormatException thrown here

Recomiendo usar la entrada NumberStyles.Number | NumberStyles.AllowExponent NumberStyles.Number | NumberStyles.AllowExponent , ya que permitirá números exponenciales y procesará la cadena bajo las reglas decimal .

CultureInfo culture = new CultureInfo(""); culture.NumberFormat.NumberDecimalDigits = 2; culture.NumberFormat.NumberDecimalSeparator = "."; culture.NumberFormat.NumberGroupSeparator = ","; Decimal.Parse("1,234.5",NumberStyles.Number | NumberStyles.AllowExponent, culture); // Does not generate a FormatException

Para responder la pregunta del afiche, la respuesta correcta debería ser:

decimal x = decimal.Parse("1.2345E-02", NumberStyles.Number | NumberStyles.AllowExponent); Console.WriteLine(x);


Tenga cuidado con la respuesta seleccionada: hay una sutileza que especifica System.Globalization.NumberStyles.Float en Decimal.Parse que podría dar lugar a System.FormatException porque su sistema podría estar esperando un número formateado con '','' en lugar de ''.''

Por ejemplo, en notación francesa, "1.2345E-02" no es válido, primero debe convertirlo a "1,2345E-02".

En conclusión, use algo como:

Decimal.Parse(valueString.Replace(''.'','',''), System.Globalization.NumberStyles.Float);


static void Main(string[] args) { decimal d = Decimal.Parse("1.2345E-02", System.Globalization.NumberStyles.Float); }