Входная строка была не в правильном формате
Я новичок в C#, у меня есть некоторые базовые знания в Java, но я не могу заставить этот код работать правильно.
Это просто базовый калькулятор, но при запуске программы VS2008 выдает мне эту ошибку:
Я сделал почти ту же программу, но в Java, используя JSwing, и она работала отлично.
Вот форма 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 = "";
}
}
В чем может быть проблема? Есть ли способ решить это?
PS: я тоже пробовал
a = Convert.ToInt32(textBox1.text);
b = Convert.ToInt32(textBox2.text);
и это не сработало.
9 ответов
Ошибка означает, что строка, из которой вы пытаетесь разобрать целое число, на самом деле не содержит действительного целого числа.
Крайне маловероятно, что текстовые поля будут содержать действительное целое число сразу после создания формы - именно там вы получаете целочисленные значения. Было бы гораздо больше смысла обновлять a
а также b
в событиях нажатия кнопки (так же, как вы находитесь в конструкторе). Кроме того, проверьте Int.TryParse
Метод - его гораздо проще использовать, если строка не может содержать целое число - он не выдает исключение, поэтому его легче восстановить.
Я столкнулся с этим точным исключением, за исключением того, что оно не имело ничего общего с анализом числовых данных. Так что это не ответ на вопрос ОП, но я думаю, что приемлемо делиться знаниями.
Я объявил строку и форматировал ее для использования с JQTree, для которого требуются фигурные скобки ({}). Вы должны использовать двойные фигурные скобки, чтобы они были приняты как правильно отформатированная строка:
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"]);
Надеюсь, это поможет другим людям, которые находят этот вопрос, но не анализируют числовые данные.
Если вы не проверяете явно для чисел в текстовом поле, в любом случае лучше использовать
int result=0;
if(int.TryParse(textBox1.Text,out result))
Теперь, если результат будет успешным, вы можете приступить к своим расчетам.
Проблемы
Есть несколько возможных случаев возникновения ошибки:
Так как
textBox1.Text
содержит только число, но число слишком большое / слишком маленькоеТак как
textBox1.Text
содержит:- а) не номер (кроме
space
в начале / конце,-
в начале) и / или - б) тысячи разделителей в применяемой культуре для вашего кода без указания
NumberStyles.AllowThousands
или вы указываетеNumberStyles.AllowThousands
но неправильноthousand separator
в культуре и / или - в) десятичный разделитель (который не должен существовать в
int
синтаксический анализ)
- а) не номер (кроме
НЕ ОК Примеры:
Случай 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
Случай 2 а)
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
Случай 2 б)
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
Дело 2 в)
NumberStyles styles = NumberStyles.AllowDecimalPoint;
a = Int32.Parse("1.189", styles); //wrong, int parse cannot parse decimal point at all!
Казалось бы, не в порядке, но на самом деле в порядке. Примеры:
Случай 2 а) ОК
a = Int32.Parse("-189"); //having - but in the beginning
b = Int32.Parse(" 189 "); //having space, but in the beginning or end
Случай 2 б) ОК
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
Решения
Во всех случаях, пожалуйста, проверьте значение textBox1.Text
с отладчиком Visual Studio и убедитесь, что он имеет чисто приемлемый числовой формат для int
спектр. Что-то вроде этого:
1234
Кроме того, вы можете рассмотреть
- с помощью
TryParse
вместоParse
чтобы не разбираемый номер не вызывал у вас проблему исключения. проверить результат
TryParse
и справиться, если нетtrue
int val; bool result = int.TryParse(textbox1.Text, out val); if (!result) return; //something has gone wrong //OK, continue using val
В моем случае я забыл поставить двойную фигурную скобку, чтобы сбежать. {{}} MyObject
Это исключение может возникнуть при использовании средства форматирования строк с недопустимым синтаксисом скобок.
// incorrect
string.Format("str {incorrect}", "replacement")
// correct
string.Format("str {1}", "replacement")
Вы не упомянули, имеют ли ваше текстовое поле значения во время разработки или сейчас. При инициализации формы текстовое поле может не иметь значения, если вы не поместили его в текстовое поле во время разработки формы. Вы можете поместить значение int в дизайн формы, установив свойство text в desgin, и это должно работать.
У меня была похожая проблема, которую я решил с помощью следующей техники:
Исключение было сгенерировано в следующей строке кода (см. Текст, отмеченный ** ниже):
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);
}
После небольшого исследования я понял, что проблема заключалась в том, что отформатированная строка содержала знак доллара ($), который методы Parse/TryParse не могут разрешить (т. Е. Удалить). Поэтому, используя метод Remove(...) строкового объекта, я изменил строку на:
number = Double.Parse(numberStr.Remove(0, 1)); // Remove the "$" from the number
В этот момент метод Parse(...) работал как положено.
Это была и моя проблема.. в моем случае я изменил номер ПЕРСИАНА на номер ЛАТИНА, и это сработало. И также обрезать вашу строку перед преобразованием.
PersianCalendar pc = new PersianCalendar();
char[] seperator ={'/'};
string[] date = txtSaleDate.Text.Split(seperator);
int a = Convert.ToInt32(Persia.Number.ConvertToLatin(date[0]).Trim());