stringa di input non era in un formato corretto
-
26-10-2019 - |
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:
ho fatto quasi lo stesso programma, ma in Java utilizzando JSwing e ha funzionato perfettamente.
Ecco la forma di 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 = "";
}
}
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.
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:
-
A causa
textBox1.Text
contiene solo il numero, ma il numero è troppo grande / troppo piccolo -
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 specificaNumberStyles.AllowThousands
ma metterethousand separator
sbagliato nella cultura e / o - c) separatore decimale (che non dovrebbe esistere in
int
parsing)
- a) non-numero (ad eccezione
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
- utilizzando
TryParse
invece diParse
per garantire che il numero non analizzata non causa si problema eccezione. -
controllare il risultato di
TryParse
e gestirlo se nontrue
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());