Подтвердить что ты не робот

Строка ввода не была в правильном формате

Я новичок в С#, у меня есть некоторые базовые знания в 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);

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

4b9b3361

Ответ 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());