Входная строка была не в правильном формате - PullRequest
65 голосов
/ 30 ноября 2011

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

95 голосов
/ 30 ноября 2011

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

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

45 голосов
/ 23 октября 2014

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

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

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

17 голосов
/ 30 ноября 2011

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

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

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

9 голосов
/ 19 апреля 2016

Проблемы

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

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

  2. Поскольку textBox1.Text содержит:

    • a) не число (кроме 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 = 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 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

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

  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
    
3 голосов
/ 23 января 2018

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

3 голосов
/ 30 ноября 2011

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

0 голосов
/ 07 июня 2018

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

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

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 (...) работал как положено.

0 голосов
/ 10 декабря 2015

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

PersianCalendar pc = new PersianCalendar();
char[] seperator ={'/'};
string[] date = txtSaleDate.Text.Split(seperator);
int a = Convert.ToInt32(Persia.Number.ConvertToLatin(date[0]).Trim());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...