Die Eingabezeichenfolge hatte kein richtiges Format

Ich bin neu mit C #, ich habe Grundkenntnisse in Java, aber ich kann diesen Code nicht richtig ausführen.

Es ist nur ein einfacher Rechner, aber wenn ich das Programm VS2008 ausführe gibt mir dieser Fehler:

Taschenrechner

Ich habe fast das gleiche Programm gemacht, aber in Java mit JSwing und es hat perfekt funktioniert.

Hier ist die Form von c #:

Bilden

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

Was kann das Problem sein? Gibt es eine Möglichkeit, es zu lösen?

PS: Ich habe es auch versucht

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

und es hat nicht funktioniert.

   

Der Fehler bedeutet, dass die Zeichenfolge, mit der Sie eine ganze Zahl analysieren möchten, keine gültige Ganzzahl enthält.

Es ist äußerst unwahrscheinlich, dass die Textfelder sofort beim Erstellen des Formulars eine gültige Ganzzahl enthalten – dort erhalten Sie die Ganzzahlwerte. Es würde viel mehr Sinn machen, a und b in den Button-Click-Events zu aktualisieren (genauso wie Sie sich im Konstruktor befinden). Überprüfen Sie auch die Int.TryParse Methode – es ist viel einfacher zu verwenden, wenn die Zeichenfolge möglicherweise tatsächlich keine ganze Zahl enthält – es wirft keine Ausnahme, so dass es einfacher ist, von zu erholen.

Ich bin genau auf diese Ausnahme gestoßen, außer dass es nichts mit dem Analysieren numerischer Eingaben zu tun hat. Das ist also keine Antwort auf die Frage des OP, aber ich denke, es ist akzeptabel, das Wissen zu teilen.

Ich hatte eine Zeichenfolge deklariert und formatierte sie für die Verwendung mit JQTree, die geschweifte Klammern ({}) erfordert. Sie müssen doppelte geschweifte Klammern verwenden, damit sie als richtig formatierte Zeichenfolge akzeptiert wird:

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

Hoffentlich hilft das anderen Leuten, die diese Frage finden, aber keine numerischen Daten analysieren.

Wenn Sie nicht explizit für Zahlen im Textfeld validieren, ist es in jedem Fall besser zu verwenden

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

Wenn das Ergebnis erfolgreich ist, können Sie mit Ihren Berechnungen fortfahren.

Probleme

Es gibt einige mögliche Fälle, warum der Fehler auftritt:

  1. Weil textBox1.Text nur die Nummer enthält, aber die Nummer ist zu groß / zu klein

  2. Weil textBox1.Text enthält:

    • a) Nicht-Nummer (außer space am Anfang / Ende, - am Anfang) und / oder
    • b) Tausendertrennzeichen in der angewandten Kultur für Ihren Code ohne Angabe von NumberStyles.AllowThousands oder Sie geben NumberStyles.AllowThousands , setzen aber ein falsches thousand separator in die Kultur und / oder
    • c) Dezimaltrennzeichen (das beim int Parsing nicht existieren sollte)

NICHT OK Beispiele:

Fall 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 

Fall 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 

Fall 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 

Fall 2 c)

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

Scheinbar NICHT OK, aber eigentlich OK Beispiele:

Fall 2 a) OK

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

Fall 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 

Lösungen

Überprüfen Sie in allen Fällen den Wert von textBox1.Text mit Ihrem Visual Studio-Debugger, und stellen Sie sicher, dass es ein rein akzeptables numerisches Format für int Bereich hat. Etwas wie das:

 1234 

Sie können auch darüber nachdenken

  1. Verwenden Sie TryParse anstelle von Parse um sicherzustellen, dass die nicht geparste Nummer kein Ausnahmeproblem verursacht.
  2. Überprüfen Sie das Ergebnis von TryParse und behandeln Sie es, wenn es nicht true

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

Sie haben nicht erwähnt, ob Ihr Textfeld Werte in der Entwurfszeit oder jetzt enthält. Wenn das Formular initialisiert wird, hat das Textfeld möglicherweise keinen Wert, wenn Sie es während des Formularentwurfs nicht in das Textfeld eingefügt haben. Sie können int-Wert in Formularentwurf setzen, indem Sie Texteigenschaft in desgin festlegen und das sollte funktionieren.

In meinem Fall habe ich vergessen, doppelte geschweifte Klammer zu setzen, um zu entkommen. {{Mein Objekt}}

Es war auch mein Problem. In meinem Fall habe ich die PERSIAN Nummer in LATIN Nummer geändert und es hat funktioniert. UND trimme auch deine Saite vor dem Konvertieren.

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

Ich hatte ein ähnliches Problem, das ich mit der folgenden Technik getriggers habe:

Die Ausnahme wurde auf die folgende Codezeile geworfen (siehe den Text mit ** unten):

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

Nach einigem Nachforschen stellte ich fest, dass das Problem darin lag, dass die formatierte Zeichenkette ein Dollarzeichen ($) enthielt, das die Parse / TryParse-Methoden nicht auflösen konnten (dh – ausziehen). Also benutze ich die Remove (…) Methode des String Objekts und ändere die Zeile zu:

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

An diesem Punkt hat die Methode Parse (…) wie erwartet funktioniert.