web-dev-qa-db-fra.com

Le fil d'alimentation n'était pas au bon format

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:

Calculator

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

Voici la forme 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? 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é.

59
kustomrtr

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.

90
Jon

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.

44
delliottg

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.

15
V4Vendetta

Problèmes

Il y a quelques cas possibles pour lesquels l'erreur se produit:

  1. Parce que textBox1.Text contient seulement un nombre, mais le 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 pour votre code sans spécifier NumberStyles.AllowThousands ou vous spécifiez NumberStyles.AllowThousands mais mettez mal thousand separator dans la culture et/ou 
    • c) séparateur décimal (qui ne devrait pas exister dans l'analyse 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 

  1. utilisez TryParse au lieu de Parse pour vous assurer que le nombre non analysé ne vous cause pas de problème d'exception.
  2. 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
    
6
Ian

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.

3
Kirtan Pandya

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

3
zawhtut

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

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.

0
astevens009