Входная строка имела неправильный формат
-
26-10-2019 - |
Вопрос
Я новичок в C#, у меня есть некоторые базовые знания в Java, но я не могу заставить этот код работать должным образом.
Это всего лишь простой калькулятор, но когда я запускаю программу VS2008, выдает следующую ошибку:
Я сделал почти ту же программу, но на Java, используя JSwing, и она работала отлично.
Вот форма С#:
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 = "";
}
}
В чем может быть проблема?Есть ли способ решить эту проблему?
ПС:я тоже попробовал
a = Convert.ToInt32(textBox1.text);
b = Convert.ToInt32(textBox2.text);
и это не сработало.
Решение
Ошибка означает, что строка, из которой вы пытаетесь проанализировать целое число, на самом деле не содержит допустимого целого числа.
Крайне маловероятно, что текстовые поля будут содержать допустимое целое число сразу после создания формы — именно здесь вы получаете целочисленные значения.Было бы гораздо разумнее обновить 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 C)
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
Вы не упомянули, есть ли в вашем текстовом поле значения в время дизайна или сейчас. Когда форма инициализирует текстовое поле, не может быть значением, если вы не помещаете его в текстовое поле, когда во время дизайна формы. Вы можете поместить int value в разработку формы, установив свойство текста в Desgin, и это должно работать.
В моем случае я забыл положить двойную кудрявую скобку, чтобы сбежать. {{myObject}}
У меня была похожая проблема, которую я решил с помощью следующей техники:
Исключение было брошено на следующей строке кода (см. Текст, украшенный ** ниже):
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());