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


83

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

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

Ответы:


111

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

Крайне маловероятно, что текстовые поля будут содержать действительное целое число сразу после создания формы - именно здесь вы получаете целые значения. Гораздо больше смысла было бы обновлять aи bв событиях нажатия кнопки (точно так же, как вы находитесь в конструкторе). Кроме того, проверьте Int.TryParseметод - его намного проще использовать, если строка может на самом деле не содержать целое число - он не создает исключения, поэтому его легче восстановить.


2
Это сообщение об ошибке также может появиться при попытке ввода Convert.ToDouble от пользователя с другой культурой, поэтому вы можете использовать Convert.ToDouble (String, IFormatProvider) вместо просто Convert.ToDouble (String). Трудно отлаживать, потому что программа будет работать в вашей системе, но выдает ошибку у некоторых пользователей, поэтому у меня есть метод для регистрации ошибок на моем сервере, и я быстро обнаружил проблему.
Винса 07

58

Я столкнулся с этим точным исключением, за исключением того, что оно не имело ничего общего с анализом числовых входных данных. Так что это не ответ на вопрос ОП, но я думаю, что поделиться знаниями приемлемо.

Я объявил строку и форматировал ее для использования с 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"]);

Надеюсь, это поможет другим людям, которые найдут этот вопрос, но не анализируют числовые данные.


19

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

int result=0;
if(int.TryParse(textBox1.Text,out result))

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


12
Обычно resultне требует инициализации.
yazanpro

12

Проблемы

Возможные случаи возникновения ошибки:

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

3

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


3

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


0

это была моя проблема ... в моем случае я изменил ПЕРСИДСКИЙ номер на ЛАТИНСКИЙ, и это сработало. И также обрежьте вашу строку перед преобразованием.

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

0

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

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

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 (...) работал должным образом.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.