Cadena de entrada no tiene el formato correcto

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 progtwig VS2008 me da este error:

Calculadora

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

Aquí está la forma de c #:

Formar

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ó.

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.

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 formateándola 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.

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.

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 aa = 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 

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.

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

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

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.