Je suis nouveau en C #, j'ai quelques connaissances de base en Java mais je ne parviens pas à faire fonctionner ce code correctement.
C'est juste une calculatrice basique, mais quand j'exécute le programme, VS2008 me donne cette erreur:
J'ai fait presque le même programme mais en Java en utilisant JSwing et cela a fonctionné parfaitement.
Voici la forme 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 = "";
}
}
Quel peut être le problème? Y a-t-il un moyen de le résoudre?
PS: j'ai aussi essayé
a = Convert.ToInt32(textBox1.text);
b = Convert.ToInt32(textBox2.text);
et ça n'a pas marché.
L'erreur signifie que la chaîne que vous essayez d'analyser un entier ne contient pas réellement un entier valide.
Il est extrêmement improbable que les zones de texte contiennent un entier valide dès la création du formulaire, c'est-à-dire où vous obtenez les valeurs entières. Il serait beaucoup plus logique de mettre à jour a
et b
dans les événements de clic de bouton (de la même manière que vous êtes dans le constructeur). Consultez également la méthode Int.TryParse
- il est beaucoup plus facile à utiliser si la chaîne ne contient pas réellement un entier - elle ne lève pas d'exception, ce qui facilite sa récupération.
J'ai rencontré cette exception exacte, sauf que cela n'avait rien à voir avec l'analyse des entrées numériques. Donc, ce n'est pas une réponse à la question du PO, mais je pense qu'il est acceptable de partager les connaissances.
J'avais déclaré une chaîne et je l'avais formatée pour l'utiliser avec JQTree , qui nécessite des accolades ({}). Vous devez utiliser des accolades doubles pour être accepté comme une chaîne correctement formatée:
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"]);
J'espère que cela aidera d'autres personnes qui trouvent cette question mais qui n'analysent pas les données numériques.
Si vous ne validez pas explicitement les nombres dans le champ de texte, dans tous les cas, il vaut mieux utiliser
int result=0;
if(int.TryParse(textBox1.Text,out result))
Maintenant, si le résultat est réussi, vous pouvez procéder à vos calculs.
Problèmes
Il y a quelques cas possibles pour lesquels l'erreur se produit:
Parce que textBox1.Text
contient seulement un nombre, mais le nombre est trop grand/trop petit
Parce que textBox1.Text
contient:
space
au début/à la fin, -
au début) et/ouNumberStyles.AllowThousands
ou vous spécifiez NumberStyles.AllowThousands
mais mettez mal thousand separator
dans la culture et/ou int
)NOT OK Exemples:
Cas 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
Cas 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
Cas 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
Cas 2 c)
NumberStyles styles = NumberStyles.AllowDecimalPoint;
a = Int32.Parse("1.189", styles); //wrong, int parse cannot parse decimal point at all!
Apparemment PAS OK, mais en fait OK Exemples:
Cas 2 a) OK
a = Int32.Parse("-189"); //having - but in the beginning
b = Int32.Parse(" 189 "); //having space, but in the beginning or end
Cas 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
Solutions
Dans tous les cas, vérifiez la valeur de textBox1.Text
avec votre débogueur Visual Studio et assurez-vous qu'il a un format numérique purement acceptable pour la plage int
. Quelque chose comme ça:
1234
En outre, vous pouvez envisager de
TryParse
au lieu de Parse
pour vous assurer que le nombre non analysé ne vous cause pas de problème d'exception.vérifier le résultat de TryParse
et le manipuler sinon true
int val;
bool result = int.TryParse(textbox1.Text, out val);
if (!result)
return; //something has gone wrong
//OK, continue using val
Vous n'avez pas indiqué si votre zone de texte avait des valeurs au moment de la conception ou maintenant. Lorsque le formulaire est initialisé, la zone de texte peut ne pas avoir de valeur si vous ne l’avez pas placée dans la zone de texte lors de la conception du formulaire. vous pouvez mettre int dans la conception de formulaire en définissant la propriété text dans desgin et cela devrait fonctionner.
Dans mon cas, j'ai oublié de mettre une double accolade pour s'échapper {{myobject}}
c'était aussi mon problème .. Dans mon cas, j'ai changé le numéro PERSIAN en numéro LATIN et cela a fonctionné .
PersianCalendar pc = new PersianCalendar();
char[] seperator ={'/'};
string[] date = txtSaleDate.Text.Split(seperator);
int a = Convert.ToInt32(Persia.Number.ConvertToLatin(date[0]).Trim());
J'ai eu un problème similaire que j'ai résolu avec la technique suivante:
L'exception a été levée à la ligne de code suivante (voir le texte décoré avec ** ci-dessous):
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);
}
Après quelques recherches, je me suis rendu compte que le problème était que la chaîne formatée incluait un signe dollar ($) que les méthodes Parse/TryParse ne pouvaient pas résoudre (c'est-à-dire - supprimer). Donc, en utilisant la méthode Remove (...) de l'objet string, j'ai modifié la ligne en:
number = Double.Parse(numberStr.Remove(0, 1)); // Remove the "$" from the number
À ce stade, la méthode Parse (...) a fonctionné comme prévu.