Вопрос

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

В чем может быть проблема?Есть ли способ решить эту проблему?

ПС:я тоже попробовал

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

Теперь, если результат достигается успехом, вы можете продолжить свои расчеты.

Проблемы

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

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

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

  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
    

Вы не упомянули, есть ли в вашем текстовом поле значения в время дизайна или сейчас. Когда форма инициализирует текстовое поле, не может быть значением, если вы не помещаете его в текстовое поле, когда во время дизайна формы. Вы можете поместить 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());
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top