Строка ввода не была в правильном формате
Я новичок в С#, у меня есть некоторые базовые знания в Java, но я не могу заставить этот код работать правильно.
Это просто базовый калькулятор, но когда я запускаю программу VS2008, я получаю эту ошибку:
![Calculator]()
Я сделал почти ту же программу, но в java с помощью JSwing, и она отлично работала.
Здесь форма С#:
![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 = "";
}
}
В чем может быть проблема? Есть ли способ решить эту проблему?
PS: Я также пробовал
a = Convert.ToInt32(textBox1.text);
b = Convert.ToInt32(textBox2.text);
и это не сработало.
Ответы
Ответ 1
Ошибка означает, что строка, которую вы пытаетесь разобрать целое число, фактически не содержит допустимого целого числа.
Очень маловероятно, что текстовые поля будут содержать действительное целое число сразу после создания формы - именно там вы получаете целые значения. Было бы гораздо разумнее обновить a
и b
в событиях нажатия кнопки (так же, как и в конструкторе). Кроме того, ознакомьтесь с методом Int.TryParse
- его гораздо проще использовать, если строка может не содержать целого числа - она не бросает исключение, поэтому вам легче восстановить.
Ответ 2
Я столкнулся с этим единственным исключением, за исключением того, что он не имел никакого отношения к анализу числовых входов. Так что это не ответ на вопрос ОП, но я считаю приемлемым делиться знаниями.
Я объявил строку и форматировал ее для использования с 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"]);
Надеюсь, это поможет другим людям, которые находят этот вопрос, но не анализируют числовые данные.
Ответ 3
Если вы явно не проверяете числа в текстовом поле, в любом случае лучше использовать
int result=0;
if(int.TryParse(textBox1.Text,out result))
Теперь, если результат будет успешным, вы можете продолжить вычисления.
Ответ 4
Вы не указали, имеют ли ваши текстовые поля значения во время разработки или сейчас. Когда форма инициализирует текстовое поле, может не иметь значения, если вы не поместили его в текстовое поле, когда во время проектирования формы. вы можете поместить значение int в дизайн формы, установив свойство text в desgin, и это должно работать.
Ответ 5
Проблемы
Есть несколько возможных случаев возникновения ошибки:
-
Поскольку textBox1.Text
содержит только число, но число слишком велико/слишком мало
-
Поскольку textBox1.Text
содержит:
- a) non-number (кроме
space
в начале/конце, -
в начале) и/или
- b) тысячи разделителей в прикладной культуре для вашего кода без указания
NumberStyles.AllowThousands
или укажите NumberStyles.AllowThousands
, но поместите неправильный thousand separator
в культуру и/или
- c) десятичный разделитель (который не должен существовать при разборе
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)
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 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
Случай 2 c)
NumberStyles styles = NumberStyles.AllowDecimalPoint;
a = Int32.Parse("1.189", styles); //wrong, int parse cannot parse decimal point at all!
Похоже, что НЕ ОК, но на самом деле ОК Примеры:
Случай 2 a) ОК
a = Int32.Parse("-189"); //having - but in the beginning
b = Int32.Parse(" 189 "); //having space, but in the beginning or end
Случай 2 b) ОК
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
Ответ 6
это была моя проблема.
в моем случае я изменил номер PERSIAN на номер LATIN, и он сработал.
И также trime ваша строка перед преобразованием.
PersianCalendar pc = new PersianCalendar();
char[] seperator ={'/'};
string[] date = txtSaleDate.Text.Split(seperator);
int a = Convert.ToInt32(Persia.Number.ConvertToLatin(date[0]).Trim());