c# exception formatexception

c# - Cadena de entrada no tiene el formato correcto



exception formatexception (8)

El error significa que la cadena de la que está tratando de analizar un entero en realidad no contiene un entero válido.

Es extremadamente improbable que los cuadros de texto contengan un número entero válido inmediatamente cuando se crea el formulario, que es donde se obtienen los valores enteros. Tendría mucho más sentido actualizar b en los eventos de clic de botón (de la misma manera que está en el constructor). Además, consulte el método Int.TryParse - es mucho más fácil de usar si la cadena no contiene realmente un número entero - no arroja una excepción por lo que es más fácil de recuperar.

Soy nuevo con C #, tengo algunos conocimientos básicos de Java, pero no puedo obtener este código para que funcione correctamente.

Es solo una calculadora básica, pero cuando ejecuto el programa VS2008 me da este error:

Hice casi el mismo programa pero en Java usando JSwing y funcionó perfectamente.

Aquí está la forma de c #:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace calculadorac { public partial class Form1 : Form { int a, b, c; String resultado; public Form1() { InitializeComponent(); a = Int32.Parse(textBox1.Text); b = Int32.Parse(textBox2.Text); } private void button1_Click(object sender, EventArgs e) { add(); result(); } private void button2_Click(object sender, EventArgs e) { substract(); result(); } private void button3_Click(object sender, EventArgs e) { clear(); } private void add() { c = a + b; resultado = Convert.ToString(c); } private void substract() { c = a - b; resultado = Convert.ToString(c); } private void result() { label1.Text = resultado; } private void clear() { label1.Text = ""; textBox1.Text = ""; textBox2.Text = ""; } }

¿Cual puede ser el problema? ¿Hay alguna manera de resolverlo?

PD: también lo intenté

a = Convert.ToInt32(textBox1.text); b = Convert.ToInt32(textBox2.text);

y no funcionó.


En mi caso, me olvidé de poner doble llave para escapar. {{myobject}}


Me encontré con esta excepción exacta, excepto que no tenía nada que ver con el análisis de las entradas numéricas. Entonces, esta no es una respuesta a la pregunta del OP, pero creo que es aceptable compartir el conocimiento.

Había declarado una cadena y estaba JQTree para usarla con JQTree que requiere llaves ({}). Debe usar llaves dobles para que se acepten como una cadena con el formato correcto:

string measurements = string.empty; measurements += string.Format(@" {{label: ''Measurement Name: {0}'', children: [ {{label: ''Measured Value: {1}''}}, {{label: ''Min: {2}''}}, {{label: ''Max: {3}''}}, {{label: ''Measured String: {4}''}}, {{label: ''Expected String: {5}''}}, ] }},", drv["MeasurementName"] == null ? "NULL" : drv["MeasurementName"], drv["MeasuredValue"] == null ? "NULL" : drv["MeasuredValue"], drv["Min"] == null ? "NULL" : drv["Min"], drv["Max"] == null ? "NULL" : drv["Max"], drv["MeasuredString"] == null ? "NULL" : drv["MeasuredString"], drv["ExpectedString"] == null ? "NULL" : drv["ExpectedString"]);

Es de esperar que esto ayude a otras personas que encuentran esta pregunta pero no están analizando datos numéricos.


No ha mencionado si su cuadro de texto tiene valores en tiempo de diseño o ahora. Cuando el formulario inicializa el cuadro de texto puede no tener valor si no lo has puesto en el cuadro de texto durante el diseño del formulario. puede poner el valor int en el diseño del formulario estableciendo la propiedad de texto en desgin y esto debería funcionar.


Si no está validando explícitamente los números en el campo de texto, en cualquier caso es mejor usar

int result=0; if(int.TryParse(textBox1.Text,out result))

Ahora, si el resultado es exitoso, puede continuar con sus cálculos.


Tuve un problema similar que resolví con la siguiente técnica:

La excepción fue lanzada en la siguiente línea de código (vea el texto decorado con ** a continuación):

static void Main(string[] args) { double number = 0; string numberStr = string.Format("{0:C2}", 100); **number = Double.Parse(numberStr);** Console.WriteLine("The number is {0}", number); }

Después de investigar un poco, me di cuenta de que el problema era que la cadena formateada incluía un signo de dólar ($) que los métodos Parse / TryParse no podían resolver (es decir, despojar). Entonces, usando el método Remove (...) del objeto de cadena, cambié la línea a:

number = Double.Parse(numberStr.Remove(0, 1)); // Remove the "$" from the number

En ese momento, el método Parse (...) funcionó como se esperaba.


también era mi problema ... en mi caso cambié el número PERSIAN al número LATIN y funcionó. Y también trime su cadena antes de convertir.

PersianCalendar pc = new PersianCalendar(); char[] seperator ={''/''}; string[] date = txtSaleDate.Text.Split(seperator); int a = Convert.ToInt32(Persia.Number.ConvertToLatin(date[0]).Trim());


Problemas

Hay algunos casos posibles por los que se produce el error:

  1. Porque textBox1.Text contiene solo un número, pero el número es demasiado grande / demasiado pequeño

  2. Porque textBox1.Text contiene:

    • a) no número (excepto space al comienzo / final, - al principio) y / o
    • b) separadores de miles en el cultivo aplicado para su código sin especificar NumberStyles.AllowThousands o especifica NumberStyles.AllowThousands pero coloca el thousand separator incorrecto en la cultura y / o
    • c) separador decimal (que no debería existir en el análisis int )

NO OK Ejemplos:

Caso 1

a = Int32.Parse("5000000000"); //5 billions, too large b = Int32.Parse("-5000000000"); //-5 billions, too small //The limit for int (32-bit integer) is only from -2,147,483,648 to 2,147,483,647

Caso 2 a)

a = Int32.Parse("a189"); //having a a = Int32.Parse("1-89"); //having - but not in the beginning a = Int32.Parse("18 9"); //having space, but not in the beginning or end

Caso 2 b)

NumberStyles styles = NumberStyles.AllowThousands; a = Int32.Parse("1,189"); //not OK, no NumberStyles.AllowThousands b = Int32.Parse("1,189", styles, new CultureInfo("fr-FR")); //not OK, having NumberStyles.AllowThousands but the culture specified use different thousand separator

Caso 2 c)

NumberStyles styles = NumberStyles.AllowDecimalPoint; a = Int32.Parse("1.189", styles); //wrong, int parse cannot parse decimal point at all!

Aparentemente NO está bien, pero en realidad está bien Ejemplos:

Caso 2 a) Aceptar

a = Int32.Parse("-189"); //having - but in the beginning b = Int32.Parse(" 189 "); //having space, but in the beginning or end

Caso 2 b) OK

NumberStyles styles = NumberStyles.AllowThousands; a = Int32.Parse("1,189", styles); //ok, having NumberStyles.AllowThousands in the correct culture b = Int32.Parse("1 189", styles, new CultureInfo("fr-FR")); //ok, having NumberStyles.AllowThousands and correct thousand separator is used for "fr-FR" culture

Soluciones

En todos los casos, compruebe el valor de textBox1.Text con su depurador de Visual Studio y asegúrese de que tenga un formato numérico textBox1.Text aceptable para el rango int . Algo como esto:

1234

Además, puede considerar de

  1. utilizando TryParse lugar de Parse para garantizar que el número no analizado no le cause un problema de excepción.
  2. comprobar el resultado de TryParse y manejarlo si no es true

    int val; bool result = int.TryParse(textbox1.Text, out val); if (!result) return; //something has gone wrong //OK, continue using val