Входная строка была не в правильном формате

Я новичок в 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))

Теперь, если результат будет успешным, вы можете приступить к своим расчетам.

Проблемы

Есть несколько возможных случаев возникновения ошибки:

  1. Так как textBox1.Text содержит только число, но число слишком большое / слишком маленькое

  2. Так как 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

Кроме того, вы можете рассмотреть

  1. с помощью TryParse вместо Parse чтобы не разбираемый номер не вызывал у вас проблему исключения.
  2. проверить результат 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());
Другие вопросы по тегам