Int.TryParse() всегда возвращает false

У меня есть следующий код

 int varOut;
 int.TryParse(txt1.Text, out varOut); // Here txt1.Text = 4286656181793660  

Здесь txt1.Text — это случайное 16-значное число, сгенерированное JavaScript, которое является целым числом. Но приведенный выше код всегда возвращает false, т. е. значение varOut всегда равно нулю.

Что я здесь делаю неправильно?


person Microsoft DN    schedule 18.12.2015    source источник
comment
Итак, вы прочитали MSDN Int32.TryParse., который говорит false ... представляет число меньше, чем MinValue, или больше, чем MaxValue. Не могли бы вы уточнить, с какой частью этого заявления вам нужна помощь?   -  person Alexei Levenkov    schedule 18.12.2015


Ответы (6)


Предел для int (целое число 32-bit) составляет от -2,147,483,648 до 2,147,483,647. Ваш номер слишком велик.

Для большого числа integer, такого как ваш случай, попробуйте вместо этого Parse использовать long.TryParse (или Int64.TryParse, поскольку Int64 равно long в C#). Ограничение для номера long находится в диапазоне -9.2e18 to 9.2e18*

long varOut;
long.TryParse(txt1.Text, out varOut); // Here txt1.Text = 4286656181793660  

Этого должно быть достаточно для вашего номера, который составляет всего около 4.2e15 (4,286,656,181,793,660).

В качестве альтернативы вы можете рассмотреть возможность использования decimal.TryParse, если хотите иметь десятичное число. число (содержащее дробь, более высокая точность).

decimal varOut;
decimal.TryParse(txt1.Text, out varOut); // Here txt1.Text = 4286656181793660  

Это тип данных 128-bit с диапазоном -7.9e28 to 7.9e28 и точностью 28-29 значащих цифр, который лучше всего подходит для любых расчетов, связанных с деньгами.

И последнее замечание для завершения ответа: может быть небезопасно использовать doubleне используйте его. Хотя double имеет очень большой диапазон ±5.0 × 10e−324 to ±1.7 × 10e308, его точность составляет всего около 15-16 цифр (ссылка).

double varOut;
double.TryParse(txt1.Text, out varOut); // Not a good idea... since the input number is 16-digit Here txt1.Text = 4286656181793660  

В этом случае ваш номер состоит из 16 цифр, что находится на границе точности double. Таким образом, в некоторых случаях вы можете получить неверный результат. Только если вы уверены, что ваш номер будет максимум с точностью до 15 цифр, вы можете безопасно его использовать.



*-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807.

person Ian    schedule 18.12.2015
comment
В основном мне нужны только значения Int32, так как в дальнейшем я использую их в функции, которая принимает только 32-битные целые значения. Может быть, мне нужно сгенерировать случайное число не больше 2 147 483 647. - person Microsoft DN; 18.12.2015

int — это просто сокращение от int32; это 32-битное (со знаком) целое число, что означает, что оно не может содержать число, превышающее около 2 миллиардов. Ваше число больше этого, поэтому оно не является допустимым значением int.

person Servy    schedule 18.12.2015

Используйте свойство MaxLength, чтобы ограничить количество цифр, и пользователь не может ввести более int32.

TextBox.MaxLength=9  
person Make Makeluv    schedule 18.12.2015

Похоже, вы можете использовать значения, которые превышают емкость используемого вами типа... посмотрите https://msdn.microsoft.com/en-us/library/system.int32.maxvalue%28v=vs.110%29.aspx

Сохраните его как long вместо int. https://msdn.microsoft.com/en-us/library/ctetwysk.aspx

person OBR_EXO    schedule 18.12.2015

Вы должны использовать long вместо int. Ваш номер слишком велик для int

person Andrew    schedule 18.12.2015

Используйте long.TryParse()

Ваше число слишком велико для преобразования в int.

или вы можете использовать int64.tryparse

person Ramankingdom    schedule 18.12.2015