2011-11-30 10 views
45

Soy nuevo con C#, tengo algunos conocimientos básicos de Java pero no puedo obtener este código para que se ejecute correctamente.La cadena de entrada no estaba en el formato correcto

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

Calculator

lo hice casi el mismo programa, pero en Java utilizando JSwing y funcionó perfectamente.

Aquí está la forma de C#:

Form

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 = ""; 
    } 
} 

Cuál puede ser el problema? ¿Hay alguna manera de resolverlo?

PS: Yo también trató

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

y no funcionó.

Respuesta

69

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

Es muy poco probable 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 a y 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 un número entero - no arroja una excepción por lo que es más fácil recuperarse.

3

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 del texto en desgin y esto debería funcionar.

13

Si no se validan de forma explícita para 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 bien, si el resultado es éxito, entonces se puede proceder con sus cálculos.

+7

Normalmente, 'result' no necesita ser inicializado. – yazanpro

36

Me encontré con esta excepción exacta, excepto que no tuvo 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.

He declarado una cadena y la está formateando para su uso con JQTree que requiere llaves ({}). Usted tiene que utilizar llaves duplicado para que pueda ser aceptado como una cadena con el formato adecuado:

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"]); 

Esperamos que esto ayudará a otras personas que se encuentran a esta pregunta, pero no está analizando los datos numéricos.

0

era mi problema también ... en mi caso cambié el número de PERSIAN al número de 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()); 
4

Problemas

Hay algunos casos posibles por las que ocurre el error:

  1. Debido textBox1.Text contiene sólo el número, pero el número es too big/too small

  2. Debido textBox1.Text contiene :

    • a) no número (excepto space en el principio/final, - al principio) y/o
    • b) separadores de miles en la cultura solicitado su código sin especificar NumberStyles.AllowThousands o especificar NumberStyles.AllowThousands pero poner mal thousand separator en el cultivo y/o
    • c) separador decimal (que no debería existir en int parsing)

NO Ejemplos OK:

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 = 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 OK Ejemplos:

Caso 2) 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) Aceptar

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, por favor, compruebe el valor de textBox1.Text con su depurador de Visual Studio y asegúrese de que tiene formato numérico puramente aceptable para int gama.Algo como esto:

1234 

Además, se puede considerar de

  1. TryParse usando en lugar de Parse para asegurar que el número no analizada no causa problema excepción.
  2. comprobar el resultado de TryParse y manejar la situación si no se true

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

En mi caso se me olvidó poner llave de doble rizado para escapar. {{myobject}}

Cuestiones relacionadas