110 votes

La chaîne d'entrée n'était pas dans un format correct

Je suis novice en C#, j'ai quelques connaissances de base en Java mais je n'arrive pas à faire fonctionner ce code correctement.

C'est juste une calculatrice de base, mais quand je lance le programme VS2008 me donne cette erreur :

Calculator

J'ai fait presque le même programme mais en java en utilisant JSwing et cela a fonctionné parfaitement.

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

Quel peut être le problème ? Existe-t-il un moyen de le résoudre ?

PS : J'ai également essayé

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

et cela n'a pas fonctionné.

137voto

Jon Points 6911

L'erreur signifie que la chaîne de caractères à partir de laquelle vous essayez d'analyser un nombre entier ne contient pas un nombre entier valide.

Il est très peu probable que les zones de texte contiennent un nombre entier valide dès la création du formulaire - c'est là que vous obtenez les valeurs entières. Il serait beaucoup plus logique de mettre à jour a y b dans les événements de clic sur le bouton (de la même manière que dans le constructeur). Consultez également la section Int.TryParse elle est beaucoup plus facile à utiliser si la chaîne de caractères peut ne pas contenir un entier - elle ne lève pas d'exception et il est donc plus facile de s'en remettre.

72voto

delliottg Points 791

J'ai rencontré cette même exception, sauf qu'elle n'avait rien à voir avec l'analyse des entrées numériques. Ce n'est donc pas une réponse à la question de l'OP, mais je pense qu'il est acceptable de partager les connaissances.

J'ai déclaré une chaîne de caractères et je l'ai formatée pour l'utiliser avec JQTree qui nécessite des accolades ({}). Vous devez utiliser des accolades doublées pour que le texte soit accepté comme une chaîne de caractères 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 se posent cette question mais qui n'analysent pas les données numériques.

22voto

V4Vendetta Points 15354

Si vous ne validez pas explicitement les nombres dans le champ de texte, il est préférable d'utiliser l'option

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

Si le résultat est positif, vous pouvez poursuivre vos calculs.

16voto

Ian Points 15625

Problèmes

L'erreur peut se produire dans plusieurs cas :

  1. Parce que textBox1.Text ne contient qu'un nombre, mais ce nombre est trop grand/trop petit

  2. Parce que textBox1.Text contient :

    • a) non numérique (sauf space au début/à la fin, - au début) et/ou
    • b) mille séparateurs dans la culture appliquée à votre code sans préciser NumberStyles.AllowThousands ou vous spécifiez NumberStyles.AllowThousands mais mal formulée thousand separator dans la culture et/ou
    • c) le séparateur décimal (qui ne doit pas exister dans le champ int l'analyse syntaxique)

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, veuillez vérifier la valeur de textBox1.Text avec votre débogueur Visual Studio et assurez-vous qu'il a un format numérique purement acceptable pour le int gamme. Quelque chose comme ça :

1234

Vous pouvez également envisager

  1. en utilisant TryParse au lieu de Parse pour s'assurer que le nombre non analysé ne cause pas de problème d'exception.
  2. vérifier le résultat de TryParse et le traiter si ce n'est pas le cas true

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

5voto

zawhtut Points 3423

Dans mon cas, j'ai oublié de mettre une double accolade pour échapper. {{myobject}}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X