из их примеров вы можете видеть, что они имели в виду, если вся строка представляет число.
Лукас
47
вернуть str.All (Char.IsDigit);
Мохсен
13
str.All (Char.IsDigit) объявит «3.14» ложным, а также «-2» и «3E14». Не говоря уже о: «0x10»
Харальд Коппулс
4
Это зависит от того, какой номер вы пытаетесь проверить. Для целых чисел без разделителя (т. Е. Строк десятичных цифр) эта проверка работает, и она совпадает с принятым ответом и подразумевается в OP.
Алекс Маццариоль
1
@Lucas, спасибо за ваш комментарий, вы понятия не имеете, как долго я пытался разобрать строку типа double как int и удивляюсь, почему она не работает ...
Novastorm
Ответы:
1160
int n;bool isNumeric =int.TryParse("123",out n);
Обновление от C # 7:
var isNumeric =int.TryParse("123",outint n);
или если вам не нужен номер, вы можете сбросить параметр out
var isNumeric =int.TryParse("123",out _);
В вар s могут быть заменены их соответствующими типами!
Хотя я бы использовал double.TryParse, так как мы хотим знать, представляет ли он число вообще.
Джон Гитцен
5
Функция вернет true, если я передам строку как "-123" или "+123". Я понимаю, что целое число имеет положительные и отрицательные значения. Но если эта строка исходит из введенного пользователем текстового поля, она должна вернуть false.
user2323308
9
Это хорошее решение, пока пользователь не
введет
попробуйте разобрать 0,60 (это запятая!), это недопустимое число, но будет проанализировано как 60!
Пол Захра
2
Я предпочитаю использовать метод расширения для этой проверки: public static bool IsNumeric(this string text) { double _out; return double.TryParse(text, out _out); }
Хамид Наими
351
Это вернет true, если inputвсе числа. Не знаю, лучше ли это TryParse, но это сработает.
Regex.IsMatch(input,@"^\d+$")
Если вы просто хотите узнать, есть ли в нем одно или несколько чисел, смешанных с символами, не указывайте ^+и $.
Regex.IsMatch(input,@"\d")
Изменить:
На самом деле я думаю, что это лучше, чем TryParse, потому что очень длинная строка может потенциально переполнить TryParse.
Построить регулярное выражение раз и навсегда было бы гораздо эффективнее.
Clément
2
@CFP +1 ... RegEx всегда лучше, чем обычные функции, когда это применимо!
МАКС
19
@ MAXE: я бы не согласился. Проверки регулярных выражений довольно медленные, поэтому часто бывают лучшие решения, если рассматривается вопрос производительности.
Михал Б.
7
изменить: вы можете добавить RegexOptions.Compiledв качестве параметра, если вы запускаете тысячи из них для возможного увеличения скоростиRegex.IsMatch(x.BinNumber, @"^\d+$", RegexOptions.Compiled)
Simon_Weaver
9
также потерпит неудачу на негативах и прочем с.
Noctis
199
Вы также можете использовать:
stringTest.All(char.IsDigit);
Он вернется trueдля всех числовых цифр (не float) и, falseесли входная строка будет какой-либо буквенно-цифровой.
Обратите внимание : stringTestне должно быть пустой строкой, так как это пройдет проверку на числовость.
Это очень круто. Однако следует помнить одну вещь: пустая строка пройдет этот тест как числовой.
Дан-г-н
2
@ dan-gph: я рад, тебе нравится. Да вы правы. Я обновил примечание выше. Спасибо!
Кунал Гоэль
1
это также не работает для десятичных случаев. Правильный тест будет stringTest.All (l => char.IsDigit (l) || '.' == l || '-' == l);
Салман Хасрат Хан
Спасибо за ваш вклад, Салман, Чтобы специально проверить десятичность из строки, вы можете пойти на - если (Decimal.TryParse (stringTest2, выходное значение)) {/ * Да, десятичное число /} else {/ Нет, не десятичное число * / }
Кунал Гоэль
6
Салман, это не так просто - это будет считаться ..--..--действительным числом. Очевидно, нет.
ссылаясь на Microsoft.VisualBasic.dll из приложения C #? Eww: P
Лукас
У меня нет проблем, чтобы использовать "IsNumeric", он работает хорошо. Также вы можете видеть, что есть небольшая разница в эффективности между TryParse и IsNumeric. Помните, что TryParse является новым в 2.0, и до этого было лучше использовать IsNumeric, чем любую другую стратегию.
Нельсон Миранда
10
Что ж, функция IsNumeric () в VB.NET внутренне использует double.TryParse () после ряда вращений, которые необходимы (среди прочего) для совместимости с VB6. Если вам не нужна совместимость, функция double.TryParse () также проста в использовании и избавляет вас от траты памяти, загружая Microsoft.VisualBasic.dll в ваш процесс.
Евро Мицелли
4
Краткое примечание: использование регулярного выражения будет намного быстрее, если вам удастся создать базовый конечный автомат, созданный раз и навсегда. Обычно для построения конечного автомата требуется O (2 ^ n), где n - длина регулярного выражения, тогда как для чтения - O (k), где k - длина искомой строки. Поэтому перестройка регулярного выражения каждый раз вносит предвзятость.
Clément
2
@Lucas На самом деле, там есть кое-что действительно приятное, например, полный парсер CSV. Нет причин не использовать его, если он существует там.
Nyerguds
32
Это, вероятно, лучший вариант в C #.
Если вы хотите узнать, содержит ли строка целое число (целое число):
Метод TryParse попытается преобразовать строку в число (целое число) и, если это удастся, вернет true и поместит соответствующее число в myInt. Если это невозможно, возвращается false.
Решения, использующие int.Parse(someString)альтернативу, показанную в других ответах, работают, но они намного медленнее, потому что выбрасывать исключения очень дорого. TryParse(...)был добавлен в язык C # в версии 2, и до этого у вас не было выбора. Теперь вы делаете: вы должны избегать Parse()альтернативы.
Если вы хотите принять десятичные числа, у десятичного класса также есть .TryParse(...)метод. Замените int на десятичное в приведенном выше обсуждении, и те же принципы применяются.
Что если они имеют в виду только целые числа? А как насчет мест где '.' разделитель группы, а не запятая (например, pt-Br)? как насчет отрицательных чисел? разделители групп (запятые на английском)? символы валюты? TryParse () может управлять всем этим, как требуется, используя NumberStyles и IFormatProvider.
Лукас
О, да, мне больше нравится версия All. Я никогда не использовал этот метод расширения, хороший вызов. Хотя должно быть s.ToCharArray (). All (..). Что касается вашего второго пункта, я слышу вас, поэтому я и предисловил, если вы не хотите использовать int.Parse .... (который, как я предполагаю, имеет больше накладных расходов ...)
BFree
11
1.3.3.8.5 на самом деле не число, а 1.23E5.
Clément
4
логика ошибочна. -1
Рассел Ян
1
@ Лукас Я согласен, что TryParse обрабатывает больше, но иногда это не нужно. Мне просто нужно проверить номер коробки моей кредитной карты (которая может содержать только цифры). Это решение почти наверняка быстрее, чем попытаться разобрать.
Милли Смит
14
Если вы хотите поймать более широкий спектр чисел, в PHP is_numeric , вы можете использовать следующее:
// From PHP documentation for is_numeric// (http://php.net/manual/en/function.is-numeric.php)// Finds whether the given variable is numeric.// Numeric strings consist of optional sign, any number of digits, optional decimal part and optional// exponential part. Thus +0123.45e6 is a valid numeric value.// Hexadecimal (e.g. 0xf4c3b00c), Binary (e.g. 0b10100111001), Octal (e.g. 0777) notation is allowed too but// only without sign, decimal and exponential part.staticreadonlyRegex _isNumericRegex =newRegex("^("+/*Hex*/@"0x[0-9a-f]+"+"|"+/*Bin*/@"0b[01]+"+"|"+/*Oct*/@"0[0-7]*"+"|"+/*Dec*/@"((?!0)|[-+]|(?=0+\.))(\d*\.)?\d+(e\d+)?"+")$");staticboolIsNumeric(stringvalue){return _isNumericRegex.IsMatch(value);}
Имейте в виду, что только то, что значение является числовым, не означает, что его можно преобразовать в числовой тип. Например, "999999999999999999999999999999.9999999999"это допустимое числовое значение perfeclty, но оно не вписывается в числовой тип .NET (то есть не определенный в стандартной библиотеке).
Не пытаться быть умным alec здесь, но это похоже на ошибку для строки "0". Мое регулярное выражение не существует. Есть ли простая настройка для этого? Я получаю "0" и, возможно, "0.0" и даже "-0.0" в качестве возможных действительных чисел.
Стив Хибберт
@ SteveHibbert - все знают, что «0» не число! Серьезно, хотя ... скорректировал регулярное выражение, чтобы соответствовать 0.
JDB до сих пор помнит Моника
Хм, это я, или "0" все еще не распознается как числовой?
Стив Хибберт
1
Будучи ленивым и невежественным в отношении регулярных выражений, я вырезал и вставил приведенный выше код, который выглядит так, как будто он включает изменение типа «0.0». Я запустил тест, чтобы проверить, что строка «0» работает .IsNumeric (), и это возвращает false. Я думаю, что тест Octal вернет true для всего, что имеет два числовых символа, где первый равен нулю (а второй от нуля до семи), но вернет false только для большого жирного одинокого нуля. Если вы проверяете «0» с кодом выше, вы получаете false? Извините, если бы я знал больше регулярных выражений, я мог бы дать лучшую обратную связь. Должен читать.
Стив Хибберт
1
! Doh! Просто перечитайте ваш комментарий выше, я пропустил дополнительную звездочку, я только обновил десятичную строку. С этим на месте, вы правы, «0» IsNumeric. Приносим извинения за ошибки и большое спасибо за обновление, надеюсь, это поможет и другим. Весьма признателен.
Стив Хибберт
14
Я знаю, что это старая ветка, но ни один из ответов на самом деле не сделал это для меня - ни неэффективно, либо не заключено в капсулу для легкого повторного использования. Я также хотел убедиться, что он вернул false, если строка была пустой или нулевой. TryParse возвращает true в этом случае (пустая строка не вызывает ошибку при разборе как числа). Итак, вот мой метод расширения строки:
publicstaticclassExtensions{/// <summary>/// Returns true if string is numeric and not empty or null or whitespace./// Determines if string is numeric by parsing as Double/// </summary>/// <param name="str"></param>/// <param name="style">Optional style - defaults to NumberStyles.Number (leading and trailing whitespace, leading and trailing sign, decimal point and thousands separator) </param>/// <param name="culture">Optional CultureInfo - defaults to InvariantCulture</param>/// <returns></returns>publicstaticboolIsNumeric(thisstring str,NumberStyles style =NumberStyles.Number,CultureInfo culture =null){double num;if(culture ==null) culture =CultureInfo.InvariantCulture;returnDouble.TryParse(str, style, culture,out num)&&!String.IsNullOrWhiteSpace(str);}}
Прост в использовании:
var mystring ="1234.56789";var test = mystring.IsNumeric();
Или, если вы хотите проверить другие типы чисел, вы можете указать «стиль». Итак, чтобы преобразовать число с экспонентой, вы можете использовать:
var mystring ="5.2453232E6";var test = mystring.IsNumeric(style:NumberStyles.AllowExponent);
Или для проверки потенциальной шестнадцатеричной строки вы можете использовать:
var mystring ="0xF67AB2";var test = mystring.IsNumeric(style:NumberStyles.HexNumber)
Необязательный параметр 'culture' может использоваться почти таким же образом.
Он ограничен тем, что не может преобразовать строки, которые слишком велики, чтобы их можно было заключить в двойные числа, но это ограниченное требование, и я думаю, что если вы работаете с числами, большими, чем эта, то вам, вероятно, потребуется дополнительная специализированная обработка чисел функционирует в любом случае.
Прекрасно работает, за исключением того, что Double.TryParse не поддерживает NumberStyles.HexNumber. См. MSDN Double.TryParse. Любая причина, почему вы TryParse перед проверкой IsNullOrWhiteSpace? TryParse возвращает false, если IsNullOrWhiteSpace не так?
Харальд Коппулс
10
Вы можете использовать TryParse, чтобы определить, может ли строка быть проанализирована в целое число.
int i;bool bNum =int.TryParse(str,out i);
Логическое значение скажет вам, сработало ли это или нет.
содержит десятичный символBigIntegers не будет анализировать числа с десятичными точками. (Итак: BigInteger.Parse("3.3")скину исключение, иTryParse за то же вернет false)
нет смешных не цифр
охватывает случаи, когда число превышает обычное использование Double.TryParse
Вам нужно будет добавить ссылку на ваш класс System.Numericsи иметь
using System.Numerics;его (ну, во-вторых, бонус, я думаю, :)
Я думаю, что этот ответ будет просто потерян между всеми остальными, но в любом случае, здесь идет.
Я в конечном итоге по этому вопросу через Google , потому что я хотел , чтобы проверить , если stringбыло numericтак , что я мог бы просто использовать double.Parse("123")вместоTryParse() метода.
Почему? Потому что раздражает необходимость объявлять outпеременную и проверять результат, TryParse()прежде чем вы узнаете, был ли анализ неудачным или нет. Я хочу использовать, ternary operatorчтобы проверить, stringявляется лиnumerical , а затем просто разобрать его в первом тройном выражении или установить значение по умолчанию во втором выражении тройного.
Нравится:
var doubleValue =IsNumeric(numberAsString)?double.Parse(numberAsString):0;
Это намного чище, чем:
var doubleValue =0;if(double.TryParse(numberAsString,out doubleValue)){//whatever you want to do with doubleValue}
Потому что IsParseableAs()пытается проанализировать строку как соответствующий тип вместо того, чтобы просто проверять, является ли строка «числовой», это должно быть довольно безопасно. И вы даже можете использовать его для нечисловых типов, которые имеют TryParse()метод, какDateTime .
Метод использует отражение, и в итоге вы вызываете TryParse()метод дважды, что, конечно, не так эффективно, но не все должно быть полностью оптимизировано, иногда удобство просто важнее.
Этот метод также можно использовать для простого разбора списка числовых строк в список doubleили другой тип со значением по умолчанию без необходимости перехвата каких-либо исключений:
var sNumbers =new[]{"10","20","30"};var dValues = sNumbers.Select(s => s.IsParseableAs<double>()?double.Parse(s):0);
Этот метод расширения позволяет вам анализировать stringкак любой, typeкоторый имеетTryParse() метод метод, а также позволяет указать значение по умолчанию, которое будет возвращаться в случае сбоя преобразования.
Это лучше, чем использовать троичный оператор с методом расширения, описанным выше, поскольку он выполняет преобразование только один раз. Это все еще использует отражение, хотя ...
Я полагаю, что вы, возможно, изобрели один из самых неэффективных подходов, которые я когда-либо видел. Вы не только дважды анализируете строку (в случае ее разбора), но и вызываете функции отражения несколько раз, чтобы сделать это. И, в конце концов, вы даже не сохраняете нажатия клавиш, используя метод расширения.
JDB до сих пор помнит Монику
Спасибо за то, что вы просто повторили то, что я написал сам со второго по последний абзац. Также, если вы берете мой последний пример во внимание, вы определенно сохраняете нажатия клавиш, используя этот метод расширения. Этот ответ не претендует на то, чтобы быть каким-то волшебным решением любой проблемы, это всего лишь пример кода. Используйте это, или не используйте это. Я думаю, что это удобно, когда используется правильно. И это включает в себя примеры как методов расширения, так и рефлексии, возможно, кто-то может извлечь из этого уроки.
Hein Andre Grønnestad
5
Ты пробовал var x = double.TryParse("2.2", new double()) ? double.Parse("2.2") : 0.0;?
JDB до сих пор помнит Монику
2
Да, и это не работает. Argument 2 must be passed with the 'out' keywordи если вы укажете outтак же, как newвы получите A ref or out argument must be an assignable variable.
Hein Andre Grønnestad
1
Производительность TryParse лучше всех выставленных здесь. Результаты: TryParse 8 Regex 20 PHP IsNumeric 30 Размышления TryParse 31 Тестовый код dotnetfiddle.net/x8GjAF
prampe
7
Если вы хотите узнать, является ли строка числом, вы всегда можете попробовать ее проанализировать:
var numberString ="123";int number;int.TryParse(numberString ,out number);
Обратите внимание, что TryParseвозвращается bool, который вы можете использовать, чтобы проверить, если ваш анализ успешно завершен.
Лучшее гибкое решение со встроенной функцией .net под названием- char.IsDigit. Работает с неограниченными длинными номерами. Он вернет true, только если каждый символ представляет собой числовое число. Я использовал его много раз без проблем и с гораздо более простым решением, которое я когда-либо нашел. Я сделал пример метода. Он готов к использованию. Кроме того, я добавил валидацию для нулевого и пустого ввода. Таким образом, метод теперь полностью пуленепробиваемый
publicstaticboolIsNumeric(string strNumber){if(string.IsNullOrEmpty(strNumber)){returnfalse;}else{int numberOfChar = strNumber.Count();if(numberOfChar >0){bool r = strNumber.All(char.IsDigit);return r;}else{returnfalse;}}}
Используйте эти методы расширения, чтобы четко различать проверку, является ли строка числовой, и содержит ли строка только 0-9 цифр.
publicstaticclassExtensionMethods{/// <summary>/// Returns true if string could represent a valid number, including decimals and local culture symbols/// </summary>publicstaticboolIsNumeric(thisstring s){decimal d;returndecimal.TryParse(s,System.Globalization.NumberStyles.Any,System.Globalization.CultureInfo.CurrentCulture,out d);}/// <summary>/// Returns true only if string is wholy comprised of numerical digits/// </summary>publicstaticboolIsNumbersOnly(thisstring s){if(s ==null|| s ==string.Empty)returnfalse;foreach(char c in s){if(c <'0'|| c >'9')// Avoid using .IsDigit or .IsNumeric as they will return true for other charactersreturnfalse;}returntrue;}}
publicstaticboolIsNumeric(thisstring input){int n;if(!string.IsNullOrEmpty(input))//.Replace('.',null).Replace(',',null){foreach(var i in input){if(!int.TryParse(i.ToString(),out n)){returnfalse;}}returntrue;}returnfalse;}
Вставьте ссылку на Visual Basic в свой проект и используйте его метод Information.IsNumeric, такой как показан ниже, и сможете захватывать числа с плавающей запятой, а также целые числа в отличие от ответа выше, который только перехватывает целые числа.
// Using Microsoft.VisualBasic;var txt ="ABCDEFG";if(Information.IsNumeric(txt))Console.WriteLine("Numeric");IsNumeric("12.3");// trueIsNumeric("1");// trueIsNumeric("abc");// false
Потенциальная проблема с этим подходом состоит в том, что IsNumericделает анализ строки символа. Таким образом, число, подобное 9999999999999999999999999999999999999999999999999999999999.99999999999будет зарегистрирован как True, даже если нет способа представить это число, используя стандартный числовой тип.
Все ответы полезны. Но при поиске решения, в котором числовое значение составляет 12 цифр или более (в моем случае), во время отладки я нашел следующее решение полезным:
double tempInt =0;bool result =double.TryParse("Your_12_Digit_Or_more_StringValue",out tempInt);
Эта переменная результата даст вам истину или ложь.
//To my knowledge I did this in a simple waystaticvoidMain(string[] args){string a, b;int f1, f2, x, y;Console.WriteLine("Enter two inputs");
a =Convert.ToString(Console.ReadLine());
b =Console.ReadLine();
f1 = find(a);
f2 = find(b);if(f1 ==0&& f2 ==0){
x =Convert.ToInt32(a);
y =Convert.ToInt32(b);Console.WriteLine("Two inputs r number \n so that addition of these text box is= "+(x + y).ToString());}elseConsole.WriteLine("One or two inputs r string \n so that concatenation of these text box is = "+(a + b));Console.ReadKey();}staticint find(string s){string s1 ="";int f;for(int i =0; i < s.Length; i++)for(int j =0; j <=9; j++){string c = j.ToString();if(c[0]== s[i]){
s1 += c[0];}}if(s == s1)
f =0;else
f =1;return f;}
Четыре отрицательных голоса, но никто не сказал, почему? Я предполагаю, что это потому, что TryParse / Parse будет лучшим вариантом, но не все, кто придет сюда, будут это знать.
njplumridge
2
Вы сделали это настолько сложным, что даже программист на Си сказал бы: «Черт возьми, должен быть более простой способ написать это»
Ch3shire
1. Нет смысла читать ДВЕ номера из консоли и добавлять их. Откуда взялась строка, в любом случае не имеет значения, поэтому нет никакой причины читать что-либо из консоли вообще.
Алгоман
2. Переменная для f не нужна, вы можете вернуть 0 или 1 напрямую - если вы хотите один возврат, вы можете использовать для этого троичный оператор. int также является неправильным типом возвращаемого значения для find, он должен быть bool, и вы можете вернуть s == s1
Algoman
3. Вы копируете цифры s в s1 и затем сравниваете s с s1. Это намного медленнее, чем нужно. Кроме того, почему вы продолжаете внутренний цикл, даже если c [0] == s [i] произошло? Вы ожидаете, что s [i] будет равно другим цифрам?
Ответы:
Обновление от C # 7:
или если вам не нужен номер, вы можете сбросить параметр out
В вар s могут быть заменены их соответствующими типами!
источник
public static bool IsNumeric(this string text) { double _out; return double.TryParse(text, out _out); }
Это вернет true, если
input
все числа. Не знаю, лучше ли этоTryParse
, но это сработает.Если вы просто хотите узнать, есть ли в нем одно или несколько чисел, смешанных с символами, не указывайте
^
+
и$
.Изменить: На самом деле я думаю, что это лучше, чем TryParse, потому что очень длинная строка может потенциально переполнить TryParse.
источник
RegexOptions.Compiled
в качестве параметра, если вы запускаете тысячи из них для возможного увеличения скоростиRegex.IsMatch(x.BinNumber, @"^\d+$", RegexOptions.Compiled)
.
Вы также можете использовать:
Он вернется
true
для всех числовых цифр (неfloat
) и,false
если входная строка будет какой-либо буквенно-цифровой.Обратите внимание :
stringTest
не должно быть пустой строкой, так как это пройдет проверку на числовость.источник
..--..--
действительным числом. Очевидно, нет.Я использовал эту функцию несколько раз:
Но вы также можете использовать;
Из бенчмаркинга есть числовые параметры
(источник: aspalliance.com )
(источник: aspalliance.com )
источник
Это, вероятно, лучший вариант в C #.
Если вы хотите узнать, содержит ли строка целое число (целое число):
Метод TryParse попытается преобразовать строку в число (целое число) и, если это удастся, вернет true и поместит соответствующее число в myInt. Если это невозможно, возвращается false.
Решения, использующие
int.Parse(someString)
альтернативу, показанную в других ответах, работают, но они намного медленнее, потому что выбрасывать исключения очень дорого.TryParse(...)
был добавлен в язык C # в версии 2, и до этого у вас не было выбора. Теперь вы делаете: вы должны избегатьParse()
альтернативы.Если вы хотите принять десятичные числа, у десятичного класса также есть
.TryParse(...)
метод. Замените int на десятичное в приведенном выше обсуждении, и те же принципы применяются.источник
Вы всегда можете использовать встроенные методы TryParse для многих типов данных, чтобы увидеть, пройдет ли рассматриваемая строка.
Пример.
Результат будет тогда = True
Результат будет тогда = Ложь
источник
В случае, если вы не хотите использовать int.Parse или double.Parse, вы можете сделать что-то вроде этого:
источник
Если вы хотите поймать более широкий спектр чисел, в PHP is_numeric , вы можете использовать следующее:
Модульный тест:
Имейте в виду, что только то, что значение является числовым, не означает, что его можно преобразовать в числовой тип. Например,
"999999999999999999999999999999.9999999999"
это допустимое числовое значение perfeclty, но оно не вписывается в числовой тип .NET (то есть не определенный в стандартной библиотеке).источник
Я знаю, что это старая ветка, но ни один из ответов на самом деле не сделал это для меня - ни неэффективно, либо не заключено в капсулу для легкого повторного использования. Я также хотел убедиться, что он вернул false, если строка была пустой или нулевой. TryParse возвращает true в этом случае (пустая строка не вызывает ошибку при разборе как числа). Итак, вот мой метод расширения строки:
Прост в использовании:
Или, если вы хотите проверить другие типы чисел, вы можете указать «стиль». Итак, чтобы преобразовать число с экспонентой, вы можете использовать:
Или для проверки потенциальной шестнадцатеричной строки вы можете использовать:
Необязательный параметр 'culture' может использоваться почти таким же образом.
Он ограничен тем, что не может преобразовать строки, которые слишком велики, чтобы их можно было заключить в двойные числа, но это ограниченное требование, и я думаю, что если вы работаете с числами, большими, чем эта, то вам, вероятно, потребуется дополнительная специализированная обработка чисел функционирует в любом случае.
источник
Вы можете использовать TryParse, чтобы определить, может ли строка быть проанализирована в целое число.
Логическое значение скажет вам, сработало ли это или нет.
источник
Если вы хотите проверить, является ли строка числом (я предполагаю, что это строка, поскольку, если это число, да, вы знаете, что оно одно).
Вы также можете сделать:
Об этом позаботятся обычные гадости
содержит десятичный символBigIntegers не будет анализировать числа с десятичными точками. (Итак:BigInteger.Parse("3.3")
скину исключение, иTryParse
за то же вернет false)Double.TryParse
Вам нужно будет добавить ссылку на ваш класс
System.Numerics
и иметьusing System.Numerics;
его (ну, во-вторых, бонус, я думаю, :)источник
Я думаю, что этот ответ будет просто потерян между всеми остальными, но в любом случае, здесь идет.
Я в конечном итоге по этому вопросу через Google , потому что я хотел , чтобы проверить , если
string
былоnumeric
так , что я мог бы просто использоватьdouble.Parse("123")
вместоTryParse()
метода.Почему? Потому что раздражает необходимость объявлять
out
переменную и проверять результат,TryParse()
прежде чем вы узнаете, был ли анализ неудачным или нет. Я хочу использовать,ternary operator
чтобы проверить,string
является лиnumerical
, а затем просто разобрать его в первом тройном выражении или установить значение по умолчанию во втором выражении тройного.Нравится:
Это намного чище, чем:
Я сделал пару
extension methods
для этих случаев:Метод расширения один
Пример:
Потому что
IsParseableAs()
пытается проанализировать строку как соответствующий тип вместо того, чтобы просто проверять, является ли строка «числовой», это должно быть довольно безопасно. И вы даже можете использовать его для нечисловых типов, которые имеютTryParse()
метод, какDateTime
.Метод использует отражение, и в итоге вы вызываете
TryParse()
метод дважды, что, конечно, не так эффективно, но не все должно быть полностью оптимизировано, иногда удобство просто важнее.Этот метод также можно использовать для простого разбора списка числовых строк в список
double
или другой тип со значением по умолчанию без необходимости перехвата каких-либо исключений:Второй метод расширения
Этот метод расширения позволяет вам анализировать
string
как любой,type
который имеетTryParse()
метод метод, а также позволяет указать значение по умолчанию, которое будет возвращаться в случае сбоя преобразования.Это лучше, чем использовать троичный оператор с методом расширения, описанным выше, поскольку он выполняет преобразование только один раз. Это все еще использует отражение, хотя ...
Примеры:
Выходы:
источник
var x = double.TryParse("2.2", new double()) ? double.Parse("2.2") : 0.0;
?Argument 2 must be passed with the 'out' keyword
и если вы укажетеout
так же, какnew
вы получитеA ref or out argument must be an assignable variable
.Если вы хотите узнать, является ли строка числом, вы всегда можете попробовать ее проанализировать:
Обратите внимание, что
TryParse
возвращаетсяbool
, который вы можете использовать, чтобы проверить, если ваш анализ успешно завершен.источник
Double.TryParse
источник
ОБНОВЛЕНИЕ Кунала Ноэля Ответ
Но для этого случая у нас есть пустые строки, которые пройдут этот тест, поэтому вы можете:
источник
Лучшее гибкое решение со встроенной функцией .net под названием-
char.IsDigit
. Работает с неограниченными длинными номерами. Он вернет true, только если каждый символ представляет собой числовое число. Я использовал его много раз без проблем и с гораздо более простым решением, которое я когда-либо нашел. Я сделал пример метода. Он готов к использованию. Кроме того, я добавил валидацию для нулевого и пустого ввода. Таким образом, метод теперь полностью пуленепробиваемыйисточник
С помощью c # 7 вы можете встроить переменную out:
источник
Используйте эти методы расширения, чтобы четко различать проверку, является ли строка числовой, и содержит ли строка только 0-9 цифр.
источник
источник
Надеюсь это поможет
источник
Вставьте ссылку на Visual Basic в свой проект и используйте его метод Information.IsNumeric, такой как показан ниже, и сможете захватывать числа с плавающей запятой, а также целые числа в отличие от ответа выше, который только перехватывает целые числа.
источник
IsNumeric
делает анализ строки символа. Таким образом, число, подобное9999999999999999999999999999999999999999999999999999999999.99999999999
будет зарегистрирован какTrue
, даже если нет способа представить это число, используя стандартный числовой тип.Попробуйте reges ниже
источник
Все ответы полезны. Но при поиске решения, в котором числовое значение составляет 12 цифр или более (в моем случае), во время отладки я нашел следующее решение полезным:
Эта переменная результата даст вам истину или ложь.
источник
Вот метод C #. Метод Int.TryParse (String, Int32)
источник
источник