Computer Wiz99 Ответов: 3

Значение было либо слишком большим, либо слишком маленьким для Int32.


У меня есть форма, которая добавляет и вычитает числа при изменении текста текстового поля. Если я введу число типа 2181003000 - 899763000, то получу такую ошибку: "значение было либо слишком большим, либо слишком маленьким для Int32". Как я могу это исправить?

protected void TextBoxNPRNA_TextChanged(object sender, EventArgs e)
   {
       int a = Convert.ToInt32(TextBoxTUNA.Text);
       int b = Convert.ToInt32(TextBoxETRNA.Text);
       int c = Convert.ToInt32(TextBoxNPRNA.Text);
       TextBoxTNA2.Text = Convert.ToString(a + b + c);
       TextBoxTR.Focus();
   }

PIEBALDconsult

Я так и думал, что ты получишь:
"Система.FormatException: входная строка была не в правильном формате.\r\n at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)\r\n at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)\r\n в системе.Преобразовать.ToInt32(строковое значение)\r\n на игровой площадке.Форма form1.Методе form1_load(объект отправителя, EventArgs в ЕА)"
А я сложение, а не вычитание.

3 Ответов

Рейтинг:
20

OriginalGriff

Почему люди настаивают на этом?

Никогда не используйте функцию Convert для изменения типа ввода: использовать метод tryparse. Таким образом, когда пользователь совершает ошибку - а они делают это постоянно - вы можете обнаружить ее до того, как она станет проблемой, и сказать им точно, что они должны сделать, чтобы исправить ее:

int a;
if (!int.TryParse(TextBoxTUNA.Text, out a))
   {
   // Report problem to user
   return;
   }


Computer Wiz99

OriginalGriff, так что у меня есть это: int a = Convert.ToInt32(TextBoxTUNA.Text); и я изменил его на этот:
int b = преобразовать.ToInt64(long)(TextBoxTL.Text);. Я получаю и ошибку между (long)(TextBoxTL.Text). Как я могу это исправить?

Andreas Gieriet

Вы поняли, что OriginalGriff объяснил, чтобы сделать? Он сказал [...] ***Никогда не используйте Convert [...]. Вы, кажется, не знаете о предложенной помощи...
Энди

Computer Wiz99

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

Andreas Gieriet

Вы искали "C# tryparse" в google?
Подумайте о задаче: что делать, если пользователь вводит дерьмо? Ты должен справиться с этим. В вашем случае числа слишком велики, чтобы поместиться в 32-битное целое число (это то, что int32 или int). Результатом является исключение (ошибка, которая говорит о том, что система не может восстановиться после плохой записи, так как вы не предоставили средства для обработки ошибок, подобных приведенным выше, изящно.

Итак, возьмем более крупный целочисленный тип, например int64 (это C# long type) и используйте TryParse, как было предложено выше. TryParse возвращает true, если было введено "никакого дерьма" и если значение укладывается в 64 бита. В противном случае он возвращает false. Чтобы разрешить преобразование TryParse для хранения значения в переменную, переменная должна быть передана в качестве параметра out этой функции. В вашем случае это должно быть так long и *нет* int.

Посмотрите на методы в google. Если это слишком высокий уровень, то я сомневаюсь, что вы вообще можете создать значимую функцию. Извини, что так прямолинейно.
Энди
PS: глядя на вашу историю вопросов, я предлагаю вам поработать с базовым учебником по C#. В интернете их очень много. Удачи вам!

Computer Wiz99

Хорошо. Это имеет больше смысла. Позвольте мне спросить вас вот о чем. Когда я вставляю код позади, например: int b = Convert.ToInt64(long)(TextBoxTL.Text);. Я не буду кодировать его таким образом, но пусть TryParse сделает это для меня вместо этого или TryParse просто проверяет, введено ли дерьмо, и обрабатывает это дерьмо для меня, чтобы пользователь знал, что они ввели дерьмо?

Andreas Gieriet

long.TryParse(...) является ли функция C# для *синтаксического анализа* (поиска в интернете, что означает синтаксический анализ) заданного текста и преобразования его в long ценность. В случае успеха он возвращается true и вкладывает свою ценность в out параметр. Если это не удалось по какой-либо причине, он возвращается false Нет никакой магии, чтобы уведомить любого пользователя. Функция ничего не знает о том, в каком контексте она используется. Все, что вы передаете, - это текст и параметр, который нужно заполнить соответствующим значением. *Вы* должны проверить возвращаемое значение (true/false) чтобы решить, что сказать пользователю. Здесь нет никакой магии.
Я думаю, что этой информации достаточно.
И пожалуйста: поработайте с базовым учебником по C#. Похоже, вам не хватает самых элементарных вещей. Не виню вас, но чтобы дать "быстрые ответы" (это форум быстрых ответов), мы должны предполагать базовый уровень unterstanding и возможность читать документацию разработчиков, скажем, из MSDN.
Энди

Computer Wiz99

Ладно, круто. Позвольте мне исследовать еще немного и вернуться, чтобы перенаправить свой вопрос.

Andreas Gieriet

Для меня преобразование завершено. Если вы пройдете через базовый учебник по C#, вы увидите, что "качество и уровень вопроса" выше и более плодотворны для всех участников.
Энди

Andreas Gieriet

Мои 5!
Энди

Рейтинг:
2

Shameel

Один int может хранить значения от -2^32-1 до 2^32. Для хранения чего-либо большего используйте long тип данных, который может хранить от -2^64-1 до 2^64.


Computer Wiz99

Шамиль, Итак, у меня есть вот что: int a = Convert.ToInt32(TextBoxTUNA.Text); и я изменил его на этот:
int b = преобразовать.ToInt64(long)(TextBoxTL.Text);. Я получаю и ошибку между (long)(TextBoxTL.Text). Как я могу это исправить?

Andreas Gieriet

Здесь вы, кажется, опять не понимаете, что означают диапазоны чисел и типы. Знаете ли вы, что такое значение (2^32)-1? Сравните его с вашим ожидаемым диапазоном значений!
Энди

Рейтинг:
1

Bhushan Mehetre

int a = Convert.ToInt32(TextBoxTUNA.Text);

Проблема в приведенном выше коде с TextBoxTUNA.Текстовое значение является 2181003000
Вы не можете хранить большое нет в малом.
-2,147,483,648 .. 2,147,483,647-это диапазон типа данных int; так как же вы можете хранить 2181003000 в int!!

Это как попытаться положить 1,5 литра в 1 литровую банку.
Вы можете сделать что-то вроде
Int32 a = Convert.ToInt32(TextBoxTUNA.Text);