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

Я новичок в C#, у меня есть некоторые базовые знания на Java, но я не могу заставить этот код работать должным образом.

Это просто обычный калькулятор, но когда я запускаю программу VS2008 дает мне эту ошибку:

Calculator

Я сделал почти ту же программу, но в java с помощью JSwing, и она работала отлично.

вот форма c#:

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);

и это не сработало.

8 ответов


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

крайне маловероятно, что текстовые поля будут содержать допустимое целое число сразу же после создания формы - где вы получаете целочисленные значения. Было бы гораздо разумнее обновить 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 содержит:

    • a) номера (кроме space в начале/конце, - в начале) и / или
    • b) тысяча сепараторов в прикладной культуре для вашего код без указания NumberStyles.AllowThousands или указать NumberStyles.AllowThousands но поставить неправильно thousand separator в культуре и/или
    • c) десятичный разделитель (который не должен существовать в int парсинг)

не OK примеры:

корпус 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 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) OK

a = Int32.Parse("-189"); //having - but in the beginning
b = Int32.Parse(" 189 "); //having space, but in the beginning or end

случай 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

решений

во всех случаях, пожалуйста, проверьте значение textBox1.Text С помощью отладчика Visual Studio и убедитесь, что он имеет чисто приемлемый числовой формат для

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
    

вы не упомянули, имеет ли ваше текстовое поле значения во время разработки или сейчас. При инициализации формы текстовое поле может не иметь значения hae, если вы не поместили его в текстовое поле во время разработки формы. вы можете поместить значение int в дизайн формы, установив свойство text в desgin, и это должно работать.


в моем случае я забыл поставить двойную фигурную скобку, чтобы убежать. {{myobject}}


Это была и моя проблема .. в моем случае я изменил персидский номер на латинский, и это сработало. А также trime вашей строки перед преобразованием.

PersianCalendar pc = new PersianCalendar();
char[] seperator ={'/'};
string[] date = txtSaleDate.Text.Split(seperator);
int a = Convert.ToInt32(Persia.Number.ConvertToLatin(date[0]).Trim());

у меня была аналогичная проблема, которую я решил со следующей техникой:

исключение было создано в следующей строке кода (см. текст, украшенный ** ниже):

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 не могут решить (т. е. - strip off). Поэтому, используя Remove(...) метод объекта string я изменил строку кому:

number = Double.Parse(numberStr.Remove(0, 1)); // Remove the "$" from the number

в этот момент разбор(...) метод работал, как ожидалось.