Cadeia de input não estava em um formato correto

Sou novo em C #, tenho alguns conhecimentos básicos em Java, mas não consigo fazer esse código funcionar corretamente.

É apenas uma calculadora básica, mas quando eu corro o programa VS2008 me dá esse erro:

Calculadora

Eu fiz quase o mesmo programa, mas em java usando JSwing e funcionou perfeitamente.

Aqui está a forma de c #:

Formato

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

Qual pode ser o problema? Existe uma maneira de resolver isso?

PS: Eu também tentei

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

e não funcionou.

O erro significa que a string que você está tentando analisar um inteiro na verdade não contém um inteiro válido.

É extremamente improvável que as checkboxs de texto contenham um inteiro válido imediatamente quando o formulário é criado – que é onde você obtém os valores inteiros. Seria muito mais sensato atualizar a e b nos events de clique de botão (da mesma maneira que você está no construtor). Além disso, confira o método Int.TryParse – é muito mais fácil de usar se a string não puder realmente conter um inteiro – ele não lança uma exceção, então é mais fácil se recuperar.

Eu corri para essa exceção exata, exceto que não tinha nada a ver com a análise de inputs numéricas. Portanto, isso não é uma resposta à pergunta do OP, mas acho que é aceitável compartilhar o conhecimento.

Eu tinha declarado uma string e estava formatando-a para uso com o JQTree que requer chaves ({}). Você tem que usar chaves duplas para que ele seja aceito como uma string formatada corretamente:

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

Espero que isso ajude outras pessoas que encontrarem essa pergunta, mas não estejam analisando dados numéricos.

Se você não está validando explicitamente para números no campo de texto, em qualquer caso, é melhor usar

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

Agora, se o resultado for sucesso, você poderá prosseguir com seus cálculos.

Problemas

Existem alguns casos possíveis porque o erro ocorre:

  1. Porque textBox1.Text contém apenas o número, mas o número é muito grande / muito pequeno

  2. Porque textBox1.Text contém:

    • a) não-número (exceto space no começo / fim, - no começo) e / ou
    • b) mil separadores na cultura aplicada para o seu código sem especificar NumberStyles.AllowThousands ou você especificar NumberStyles.AllowThousands mas colocar errado thousand separator na cultura e / ou
    • c) separador decimal (que não deve existir na análise int )

NÃO OK Exemplos:

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 não está OK, mas na verdade OK Exemplos:

Caso 2 a) OK

 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 

Soluções

Em todos os casos, verifique o valor de textBox1.Text com o depurador do Visual Studio e verifique se ele tem formato numérico puramente aceitável para o intervalo int . Algo assim:

 1234 

Além disso, você pode considerar

  1. usando TryParse vez de Parse para garantir que o número não analisado não cause problema de exceção.
  2. verificar o resultado do TryParse e lidar com isso se não for true

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

Você não mencionou se sua checkbox de texto possui valores em tempo de design ou agora. Quando o formulário inicializa, a checkbox de texto pode não ter valor se você não o tiver colocado na checkbox de texto durante o design do formulário. você pode colocar o valor int no design do formulário definindo a propriedade text no desgin e isso deve funcionar.

No meu caso eu esqueci de colocar uma chave dupla para escaping. {{myobject}}

foi o meu problema também .. no meu caso eu mudei o número PERSIANO para o número LATIN e funcionou. E também trime sua string antes de converter.

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

Eu tive um problema semelhante que resolvi com a seguinte técnica:

A exceção foi lançada na seguinte linha de código (veja o texto decorado com ** abaixo):

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

Após um pouco de investigação, percebi que o problema era que a string formatada incluía um sinal de dólar ($) que os methods Parse / TryParse não conseguiam resolver (isto é, remover). Então, usando o método Remove (…) do object string eu mudei a linha para:

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

Nesse momento, o método Parse (…) funcionava como esperado.