Invoertekenreeks had niet het juiste formaat

Ik ben nieuw met C#, ik heb enige basiskennis van Java, maar ik krijg deze code niet goed uitgevoerd.

Het is maar een eenvoudige rekenmachine, maar als ik het programma VS2008 start, krijg ik deze foutmelding:

Ik heb bijna hetzelfde programma gedaan, maar in Java met JSwing en het werkte perfect.

Dit is de vorm van 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 = "";
    }
}

Wat kan het probleem zijn? Is er een manier om het op te lossen?

PS: ik heb het ook geprobeerd

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

en het werkte niet.


Antwoord 1, Autoriteit 100%

De fout betekent dat de reeks die u probeert te ontleden van een geheel getal, niet daadwerkelijk een geldig geheel getal bevat.

Het is uiterst onwaarschijnlijk dat de tekstvakken onmiddellijk een geldig geheel getal bevatten wanneer het formulier is gemaakt – waar u de gehele getalwaarden krijgt. Het zou veel zinvol zijn om aen bin de knop op gebeurtenissen te updaten (op dezelfde manier die u in de constructor bevindt). Bekijk ook de Int.TryParseMethode – Het is veel gemakkelijker te gebruiken als de string misschien niet een geheel getal bevat – het gooit geen uitzondering, dus het is gemakkelijker om van te herstellen.


Antwoord 2, Autoriteit 52%

Ik liep deze exacte uitzondering tegen, behalve dat het niets te maken had met het parseren van numerieke inputs. Dit is dus geen antwoord op de vraag van de OP, maar ik denk dat het acceptabel is om de kennis te delen.

Ik had een string uitgeroepen en formatteerde het voor gebruik met jqtree die gekruld is een beugel ({}). U moet verdubbelde krullende beugels gebruiken om te worden geaccepteerd als een goed geformatteerde string:

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

Hopelijk helpt dit andere mensen die deze vraag vinden, maar geen numerieke gegevens ontleden.


Antwoord 3, autoriteit 17%

Als u niet expliciet valideert voor getallen in het tekstveld, kunt u het in ieder geval beter gebruiken

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

Als het resultaat nu een succes is, kunt u doorgaan met uw berekeningen.


Antwoord 4, autoriteit 10%

Problemen

Er zijn enkele mogelijke gevallen waarom de fout optreedt:

  1. Omdat textBox1.Textalleen een nummer bevat, maar het nummer is te groot/te klein

  2. Omdat textBox1.Texthet volgende bevat:

    • a) niet-nummer (behalve spacein het begin/eind, -in het begin) en/of
    • b) duizend scheidingstekens in de toegepaste cultuur voor uw code zonder NumberStyles.AllowThousandsop te geven of u specificeert NumberStyles.AllowThousandsmaar plaatst het verkeerde thousand separatorin de cultuur en/of
    • c) decimaalteken (dat niet zou mogen voorkomen in intparsing)

NIET OK Voorbeelden:

Geval 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

Geval 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

Geval 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

Geval 2 c)

NumberStyles styles = NumberStyles.AllowDecimalPoint;
a = Int32.Parse("1.189", styles); //wrong, int parse cannot parse decimal point at all!

Schijnbaar NIET OK, maar eigenlijk OK Voorbeelden:

Geval 2 a) OK

a = Int32.Parse("-189"); //having - but in the beginning
b = Int32.Parse(" 189 "); //having space, but in the beginning or end

Geval 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

Oplossingen

Controleer in alle gevallen de waarde van textBox1.Textmet uw Visual Studio-foutopsporingsprogramma en zorg ervoor dat het een puur acceptabel numeriek formaat heeft voor het bereik int. Zoiets als dit:

1234

U kunt ook overwegen

  1. gebruik TryParsein plaats van Parseom ervoor te zorgen dat het niet-geparseerde nummer geen uitzonderingsprobleem veroorzaakt.
  2. controleer het resultaat van TryParseen behandel het indien niet true

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

Antwoord 5, autoriteit 2%

Je hebt niet vermeld of je tekstvak waarden heeft in de ontwerptijd of nu. Wanneer het formulier wordt geïnitialiseerd, heeft het tekstvak mogelijk geen waarde als u het niet in het tekstvak hebt geplaatst tijdens het ontwerp van het formulier. je kunt int-waarde in formulierontwerp plaatsen door de teksteigenschap in desgin in te stellen en dit zou moeten werken.


Antwoord 6, autoriteit 2%

In mijn geval vergat ik een dubbele accolade te plaatsen om te ontsnappen. {{mijnobject}}


Antwoord 7

het was ook mijn probleem..
in mijn geval veranderde ik het PERZISCHE nummer in het LATIJNSE nummer en het werkte.
EN trim ook je string voordat je gaat converteren.

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

Antwoord 8

Ik had een soortgelijk probleem dat ik met de volgende techniek heb opgelost:

De uitzondering werd gegenereerd op de volgende regel van de code (zie de tekst versierd met ** hieronder):

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

Na een beetje onderzoeken, besefte ik dat het probleem was dat de geformatteerde reeks een dollarteken ($) omvatte dat de parse / tryparse-methoden niet kunnen oplossen (d.w.z. strip uit). Dus met behulp van de methode verwijderen (…) van het string-object heb ik de regel gewijzigd naar:

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

Op dat moment werkte de parse (…) methode zoals verwacht.


Antwoord 9

U kunt deze uitzondering tegenkomen wanneer u een reeks formatter gebruikt met ongeldige beugelsyntaxis.

// incorrect
string.Format("str {incorrect}", "replacement")
// correct
string.Format("str {1}", "replacement")

Other episodes