#c# #int #validation
#c# #int #проверка
Вопрос:
Мне нужно проверить, является ли ввод значением int или нет. Существует ли функция, аналогичная строке.IsNullOrEmpty(), как функция Int.isWholeNumber()?
Есть ли способ проверить это только внутри if()
инструкции, без необходимости объявлять int перед этим? (Как вам нужно сделать с TryParse())
Редактировать
Мне нужно подтвердить код города (пять цифр)
Комментарии:
1. Что вы подразумеваете под целым числом? Неотрицательный?
2. И в чем проблема объявить int раньше? Конечно, вы можете написать регулярное выражение для проверки ввода только цифр, но я думаю, что это будет дороже, чем int. Попробуйте проанализировать.
3. Википедия( en.wikipedia.org/wiki/Whole_number ) допустим, термин «целое число» немного двусмыслен . Что это значит для вас?
4. @Aliostad «целое число» — это целое число, если честно, что-то вроде термина начальной школы.
5. @Ben этот термин не имеет общего значения для всех.
Ответ №1:
Я не верю, что в BCL существует какой-либо подобный метод, но его легко написать (я предполагаю, что вы действительно говорите о том, может ли строка быть проанализирована как целое число):
public static bool CanParse(string text)
{
int ignored;
return int.TryParse(text, out ignored);
}
Добавляйте перегрузки, принимающие IFormatProvider
значения и т.д. По мере необходимости. Предполагая, что это для проверки, вы можете захотеть расширить ее, чтобы разрешить также указывать диапазон допустимых значений…
Если вы выполняете много пользовательских проверок, вы вполне можете захотеть взглянуть на проект Fluent Validation.
Комментарии:
1. Визит знаменитости. Я думаю, что отсутствие пометки этого как решения может вызвать у меня проблемы с SO =)
Ответ №2:
Из ваших комментариев я понял, что ваша реальная проблема заключается в том, «как мне определить, содержит ли эта строка действительный почтовый индекс Швеции?» Почтовый индекс Швеции — это пятизначное число, не начинающееся с нуля. Если это проблема, которую вам действительно нужно решить, то решите эту проблему. Вместо того, чтобы пытаться преобразовать строку в целое число, а затем проверять целое число, я бы просто написал проверки, которые говорят:
- длина строки составляет пять символов? Если нет, отклоните ее.
- является первым символом строки 1, 2, 3, 4, 5, 6, 7, 8 или 9? Если нет, отклоните ее.
- являются ли второй, третий, четвертый и пятый символами строки 0, 1, 2, 3, 4, 5, 6, 7, 8 или 9? Если нет, отклоните ее.
Вот так просто. Если вы никогда не собираетесь выполнять математические вычисления на нем, в первую очередь, не преобразуйте его в целое число.
Этот подход в дальнейшем будет обобщен на более сложные формы. Насколько я понимаю, почтовые индексы Швеции часто записываются в форме «SE-12 345», то есть с префиксом «SE-» и пробелом между цифрами два и три. Будет ужасно сложно написать процедуру проверки целых чисел, которая имеет дело с этим форматом, но написать процедуру проверки строк просто.
В более общем плане, это иллюстрирует несколько хороших советов по написанию вопросов. Задайте вопрос о проблеме, которую вы на самом деле должны решить. Вы приняли решение — проанализировали строку как целое число — и затем начали задавать вопросы о вашем предполагаемом решении. Это автоматически запрещает кому-либо давать советы, относящиеся к вашей реальной проблеме. Возможно, кто-то, читающий это, уже разработал библиотеку программного обеспечения для проверки почтовых индексов; если у них есть, они никогда не догадаются рассказать вам об этом из вашего первоначального вопроса.
Комментарии:
1. Как мне сказать это, не выдавая себя за умника? Мой вопрос возник из-за проверки кода области, но мой фактический вопрос не имел к этому никакого отношения. Я просто хотел знать, как проверить значение int в одной строке кода. БД принимает значение int длиной всего пять (я его не проектировал и не склонен его переделывать). Ответ Джона точен и по существу. Не то чтобы я не оценил ваш ответ и ваши усилия!
Ответ №3:
Вы можете достичь этого с помощью методов расширения:
Вы используете
bool isNumber = "-1990".IsNumber();
Вот код:
public static class NumberStringExtension
{
public static bool IsNumber(this string value)
{
int i = 0;
return int.TryParse(value, out i));
}
}
Комментарии:
1. Обратите внимание, что вы можете записать все после объявления как:
return int.TryParse(value, out i) amp;amp; i >= 0;
. Считаете ли вы это более или менее читаемым, чем более длинная форма, — это личное предпочтение 🙂2. У меня навязчивая идея по методам расширения, я не могу сопротивляться этому 🙂
3. Методы расширения работают, но зачем вам «неотрицательное» расширение «WholeNumberString»?
4. @JMc Я изменил код. Оказалось, что OP интересовался числами, а не неотрицательными, как я думал.
Ответ №4:
Посмотрите, есть ли int.Попробуйте проанализировать, чтобы получить ответ, и убедитесь, что во входной строке нет десятичной точки. (Это даст вам ложноположительный результат, если кто-то введет «1.» в качестве входных данных.)
string input;
int ignored;
bool wholeNumber = int.TryParse(input, out ignored) amp;amp; input.indexOf('.') == -1;
Ответ №5:
Используйте Int.TryParse
или создайте пользовательскую функцию.
function bool IsNumber(object number)
{
try
{
Convert.ToInt32(number.ToString());
return true;
}
catch
{
return false;
}
}
Комментарии:
1. Если вы собираетесь выдать исключение, если текст не является числом, вы могли бы также просто вызвать
int.Parse
для начала… (Я также думаю, что вы пропустили часть вопроса, где OP сказал «без необходимости объявлять int раньше».)
Ответ №6:
типы int по определению должны быть целыми числами. Чтобы быть нецелым числом, оно должно иметь тип double, float или decimal. Вы всегда можете попробовать протестировать тип входных данных.
Или, может быть, входные данные представляют собой строку? Если входные данные представляют собой строку, вы могли бы попробовать поискать символ ‘.’ или ‘,’ (в зависимости от культуры). Или вы могли бы попробовать синтаксический анализ как целое число.
Ответ №7:
Поскольку каждый int представляет собой целое число, это просто:
public static bool IsWholeNumber(int i)
{
return true;
}
Комментарии:
1. Это худшая функция, которую я когда-либо видел. Это даже близко не то, что он хочет сделать.
Ответ №8:
Если вы просто хотите проверить это в операторе if, вы могли бы просто сделать
If ( val % 1 > 0)
//not whole number
Комментарии:
1. Это не отвечает на вопрос пользователя. Это не гарантирует, что значение, вводимое пользователем, является четным числом.
2. В @Ramhound The used на самом деле никогда не указывалось, какой тип ввода это был. Я предполагал, что входные данные были числового типа. Если входные данные имеют числовой тип, это фактически сработает так, как было задано.