Die Eingabezeichenfolge hatte kein korrektes Format


83

Ich bin neu in C #, habe einige Grundkenntnisse in Java, kann diesen Code jedoch nicht ordnungsgemäß ausführen.

Es ist nur ein einfacher Taschenrechner, aber wenn ich das Programm VS2008 ausführe, wird folgende Fehlermeldung angezeigt:

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 einen Weg, 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.

Antworten:


111

Der Fehler bedeutet, dass die Zeichenfolge, aus der Sie eine Ganzzahl 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. Hier erhalten Sie die Ganzzahlwerte. Es wäre viel sinnvoller, Ereignisse zu aktualisieren aund bauf die Schaltfläche zu klicken (genauso wie Sie sich im Konstruktor befinden). Schauen Sie sich auch die Int.TryParseMethode an - sie ist viel einfacher zu verwenden, wenn die Zeichenfolge möglicherweise keine Ganzzahl enthält - sie löst keine Ausnahme aus, sodass die Wiederherstellung einfacher ist.


2
Diese Fehlermeldung kann auch ausgegeben werden, wenn versucht wird, Eingaben von Convert.ToDouble von Benutzern mit unterschiedlichen Kulturinformationen zu konvertieren, sodass Sie Convert.ToDouble (String, IFormatProvider) anstelle von Convert.ToDouble (String) verwenden können. Es ist schwer zu debuggen, da das Programm auf Ihrem System funktioniert, aber bei einigen Benutzern Fehler auslöst. Aus diesem Grund habe ich eine Methode zum Protokollieren von Fehlern auf meinem Server und habe das Problem schnell herausgefunden.
Vinsa

58

Ich bin genau auf diese Ausnahme gestoßen, außer dass sie nichts mit dem Parsen numerischer Eingaben zu tun hatte. Dies 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, für das geschweifte Klammern ({}) erforderlich sind. Sie müssen doppelte geschweifte Klammern verwenden, damit es 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 dies anderen Leuten, die diese Frage finden, aber keine numerischen Daten analysieren.


18

Wenn Sie nicht explizit nach Zahlen im Textfeld suchen, ist es auf jeden Fall besser, diese zu verwenden

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

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


11
Muss resultnormalerweise nicht initialisiert werden.
Yazanpro

11

Probleme

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

  1. Da textBox1.Textenthält nur Zahl, aber die Zahl ist zu groß / zu klein

  2. Weil textBox1.Textenthält:

    • a) Nicht-Nummer (außer spaceam Anfang / Ende, -am Anfang) und / oder
    • b) Tausend Trennzeichen in der angewandten Kultur für Ihren Code ohne Angabe NumberStyles.AllowThousandsoder Angabe, NumberStyles.AllowThousandsaber falsch thousand separatorin der Kultur und / oder
    • c) Dezimaltrennzeichen (das beim intParsen nicht vorhanden sein 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 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

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 jedem Fall den Wert von textBox1.Textmit Ihrem Visual Studio-Debugger und stellen Sie sicher, dass er ein rein akzeptables numerisches Format für den intBereich hat. Etwas wie das:

1234

Sie können auch in Betracht ziehen

  1. Verwenden von TryParseanstelle von, Parseum sicherzustellen, dass die nicht analysierte Nummer kein Ausnahmeproblem verursacht.
  2. Überprüfen Sie das Ergebnis von TryParseund behandeln Sie es, wenn nichttrue

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

3

Sie haben nicht erwähnt, ob Ihr Textfeld Werte in der Entwurfszeit oder jetzt hat. 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 den int-Wert in das Formular-Design einfügen, indem Sie die Texteigenschaft in desgin festlegen. Dies sollte funktionieren.


3

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


0

Es war auch mein Problem. In meinem Fall habe ich die PERSISCHE Nummer in LATEINISCHE Nummer geändert und es hat funktioniert. UND schneiden Sie Ihren String auch vor dem Konvertieren ab.

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

0

Ich hatte ein ähnliches Problem, das ich mit der folgenden Technik gelöst habe:

Die Ausnahme wurde in der folgenden Codezeile ausgelöst (siehe den mit ** unten verzierten Text):

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 bestand, dass die formatierte Zeichenfolge ein Dollarzeichen ($) enthielt, das die Parse / TryParse-Methoden nicht auflösen können (dh entfernen). Also habe ich mit der Remove (...) -Methode des String-Objekts die Zeile geändert in:

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

Zu diesem Zeitpunkt funktionierte die Parse (...) -Methode wie erwartet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.