2015-06-12 2 views
5

Sono un principiante assoluto quando si tratta di C#. Cercando di imparare tramite esempi. Quindi mi sono trovato un bel tutorial per calcolatrice. Tutto va bene fino all'ultimo momento, il codice funziona, ma non richiede input a più cifre come 33. C'è una dichiarazione bool lì per attivare/disattivare operazioni aritmetiche e istruttore tutorial calcolato, che dovremmo mettere bool = false prima dell'inserimento del numero/premere il pulsante (in button_Click).L'istruzione boolea C# genera una strana eccezione per apparentemente non collegata double.parse (stringa)

il suo codice è simile al seguente:

public partial class MainWindow : Window 
{ 
    double value = 0; 
    string operation = ""; 
    bool operation_pressed = false; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void button_Click(object sender, RoutedEventArgs e) 
    { 
     if ((tb.Text == "0") || (operation_pressed == true)) 
      tb.Clear(); 

     operation_pressed = false; 
     Button b = (Button)sender; 
     tb.Text += "\n" + b.Content.ToString(); 
    } 

    private void operator_Click(object sender, RoutedEventArgs e) 
    { 
     Button b = (Button)sender; 
     operation = b.Content.ToString(); 
     value = double.Parse(tb.Text); 
     operation_pressed = true; 
     equation.Content = value + " " + operation; 
    } 

    private void result_Click(object sender, RoutedEventArgs e) 
    { 

     equation.Content = ""; 
     switch(operation) 
     { 
      case "+": 
       tb.Text = "\n" + (value + double.Parse(tb.Text)).ToString(); 
       break; 
      case "-": 
       tb.Text = "\n" + (value - double.Parse(tb.Text)).ToString(); 
       break; 
      case "*": 
       tb.Text = "\n" + (value * double.Parse(tb.Text)).ToString(); 
       break; 
      case "/": 
       tb.Text = "\n" + (value/double.Parse(tb.Text)).ToString(); 
       break; 
      default: 
       break; 
     } 
    } 

    private void CE_Click(object sender, RoutedEventArgs e) 
    { 
     tb.Text = "\n 0"; 
    } 

    private void C_Click(object sender, RoutedEventArgs e) 
    { 
     tb.Clear(); 
     equation.Content = ""; 
     value = 0; 
    } 
} 

Compila bene. Ma quando cerco di inserire un numero multidigit e seguirlo con un operatore matematico, viene generata un'eccezione per value = double.Parse(tb.Text); che gli Stati:

When converting string to DateTime, parse the string to take the date before putting each variable into the DateTime object.

Sono così confuso in questo momento. Non c'è nemmeno il DateTime coinvolto! E io sono al 100% positivo, tutto è come nel tutorial. Cosa sta succedendo? :/

Qualsiasi aiuto sarà apprezzato molto!

EDIT

Schermata di errore effettivo:

The error

+0

Quindi si immette il numero multidigit e un operatore matematico in 'tb.text' ?? – Adam

+3

Non ho mai visto un messaggio di eccezione simile prima. Sei sicuro che sia l'errore vero che stai ricevendo? E che in realtà proviene da quella linea? I * altamente dubbio * 'double.Parse()' lo lancia come eccezione. – David

+0

Prova questo double someValue = double.Parse (tb.Text); value = SomeValue; ottieni ancora l'errore nel Parse? La proprietà value è legata a un editor? –

risposta

5

Prima di tutto, si sta interpretando il debugger in modo non corretto. Questo è non il messaggio di errore:

When converting string to DateTime, parse the string to take the date before putting each variable into the DateTime object.

Avviso come è indicato come "Suggerimenti per la risoluzione". Nella stragrande maggioranza dei casi, puoi ignorarlo. Il messaggio di errore è in una lingua che non conosco, quindi non posso parlare a cosa dice. Ma un FormatException significa essenzialmente che stai cercando di analizzare un valore che non può essere analizzato.

La schermata dello schermo interrompe alcune informazioni, ma qual è il valore di tb.Text? È una di quelle stringhe "+"? Se è così, allora questo è il tuo problema.

"+" non può essere analizzato come valore numerico, perché "+" non è un numero.

È possibile rendere il codice un po 'più resistente agli errori utilizzando TryParse anziché Parse. Qualcosa di simile a questo:

double result; 
if (!double.TryParse(tb.Text, out result)) 
{ 
    // couldn't parse 
} 

Se non viene inserito il blocco if, quindi result conterrà il valore analizzato con successo. Se è immesso, il valore non può essere analizzato. Come gestisci questa situazione dipende da te. Un messaggio di errore per l'utente, un valore predefinito al posto del valore analizzato, ecc. Questa è la logica dell'applicazione che devi definire.

Il punto è, tb.Text contiene un valore non numerico che si sta tentando di convertire in un valore numerico. Quindi l'errore.

+0

Il fatto è - funziona, quando 'operation_pressed = false;' è in 'result_Click', ma non lo fa (e diventa boom) quando è in' button_Click'. E a giudicare dal tutorial DOVREBBE esserci, accettare numeri multidigit come valori lavora per il ragazzo che ha realizzato il video tutorial che sto seguendo. – roonroon

+0

@roonroon: "Funziona" e "non funziona" è un'affermazione molto ampia e generica, e temo che non porti molto valore al codice. Non riesco a parlare con il tutorial che stai seguendo o con ciò che la tua applicazione intende fare. Ma l'eccezione specifica si verifica perché stai cercando di analizzare una stringa non numerica in un numero. Tuttavia puoi prevenirlo, devi prevenirlo. Forse stai analizzando il valore sbagliato, forse quell'input non dovrebbe consentire valori non numerici, forse qualche logica non è corretta da qualche altra parte ... Non posso sapere. Sta a te capire la logica del tuo programma. – David

+0

@roonroon Qual è il valore di tb.Text quando si blocca? È un numero intero o no? A seconda delle impostazioni della lingua del tuo PC potrebbe essere necessario utilizzare un overload di TryParse.Check this: https://msdn.microsoft.com /en-us/library/ew0seb73(v=vs.110).aspx –

0

provare questo codice nel caso in operator_Click

Button b = (Button)sender; 
operation = b.Text; 
value = Convert.ToDouble(tb.text) 
+0

Si dice che "Button b" non ha la definizione ".Text":/ – roonroon

+0

ok allora usa lo stesso codice che hai, ma fai semplicemente la conversione come ho detto. es. valore = Convert.ToDouble (tb.Text); – hdkhardik

+0

'Convert.ToDouble' genererà la stessa eccezione di' double.Parse'. – David