Domanda

Sono nuovo con C #, ho una certa conoscenza di base in Java, ma non riesco a ottenere questo codice per eseguire correttamente.

E 'solo una calcolatrice di base, ma quando ho eseguito il programma VS2008 mi dà questo errore:

Calcolatrice

ho fatto quasi lo stesso programma, ma in Java utilizzando JSwing e ha funzionato perfettamente.

Ecco la forma di 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 = "";
    }
}

Quale può essere il problema? C'è un modo per risolverlo?

PS: Ho anche provato

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

e non ha funzionato.

È stato utile?

Soluzione

I mezzi di errore che la stringa si sta cercando di analizzare un numero intero da realtà non contiene un intero valido.

E 'estremamente improbabile che le caselle di testo conterrà un intero valido immediatamente quando si crea la forma - che è dove stai ricevendo i valori interi. Avrebbe molto più senso aggiornamento a e b negli eventi pulsante di scatto (nello stesso modo in cui si è nel costruttore). Inoltre, controllare la href="http://msdn.microsoft.com/en-us/library/f02979c7.aspx" rel="noreferrer"> Int.TryParse metodo

Altri suggerimenti

Mi sono imbattuto in questa eccezione esatto, solo che non aveva nulla a che fare con l'analisi input numerici. Quindi questo non è una risposta alla domanda del PO, ma penso che sia accettabile per condividere la conoscenza.

I aveva dichiarato una corda ed è stato formattazione per l'uso con JQTree che richiede ricci parentesi ({}). Devi usare le parentesi graffe raddoppiati per poter essere accettato come una stringa formattata correttamente:

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

Speriamo che questo vi aiuterà altre persone che trovano questa domanda, ma non sono l'analisi di dati numerici.

Se non si sta convalidando esplicitamente per i numeri nel campo di testo, in ogni caso è meglio utilizzare

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

Ora, se il risultato è successo allora si può procedere con i vostri calcoli.

Problemi

Ci sono alcuni casi possibili perché si verifica l'errore:

  1. A causa textBox1.Text contiene solo il numero, ma il numero è troppo grande / troppo piccolo

  2. A causa textBox1.Text contiene:

    • a) non-numero (ad eccezione space nella inizio / fine, - all'inizio) e / o
    • b) separatori delle migliaia nella cultura applicata per il codice senza specificare NumberStyles.AllowThousands o si specifica NumberStyles.AllowThousands ma mettere thousand separator sbagliato nella cultura e / o
    • c) separatore decimale (che non dovrebbe esistere in int parsing)

Esempi Non OK:

Caso 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

Caso 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

Caso 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

Caso 2 c)

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

Apparentemente non ok, ma gli esempi in realtà OK:

Caso 2 a) OK

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

Caso 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

Soluzioni

In tutti i casi, si prega di controllare il valore della textBox1.Text con il debugger di Visual Studio e assicurarsi che esso ha formato numerico puramente accettabile per la gamma int. Qualcosa di simile a questo:

1234

Inoltre, si può considerare di

  1. utilizzando TryParse invece di Parse per garantire che il numero non analizzata non causa si problema eccezione.
  2. controllare il risultato di TryParse e gestirlo se non true

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

Non hai menzionato se il testo ha valori in fase di progettazione o ora. Quando la forma inizializza casella di testo può value non hae se non hanno messo in campo testo quando in fase di progettazione form. si può mettere il valore int nel design forma impostando la proprietà testo in desgin e questo dovrebbe funzionare.

Nel mio caso ho dimenticato di mettere doppia parentesi graffa di fuggire. {{MyObject}}

Ho avuto un problema simile che ho risolto con la seguente tecnica:

L'eccezione è stato gettato al seguente riga di codice (si veda il testo decorato con ** sottostante):

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

Dopo un po 'di indagare, mi sono reso conto che il problema era che la stringa formattata incluso il simbolo del dollaro ($) che i metodi Parse / TryParse non possono risolvere (vale a dire - togliere). Quindi, utilizzando il Rimuovi (...) metodo dell'oggetto stringa ho cambiato la linea:

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

A quel punto il metodo Parse (...) ha funzionato come previsto.

è stato il mio problema troppo .. nel mio caso ho cambiato il numero PERSICO al numero di LATINA e ha funzionato. E anche Trime la stringa di prima della conversione.

PersianCalendar pc = new PersianCalendar();
char[] seperator ={'/'};
string[] date = txtSaleDate.Text.Split(seperator);
int a = Convert.ToInt32(Persia.Number.ConvertToLatin(date[0]).Trim());
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top