z ich przykładów widać, że mieli na myśli, jeśli cały ciąg reprezentuje liczbę.
Lucas
47
return str.All (Char.IsDigit);
Mohsen
13
str.All (Char.IsDigit) zadeklaruje „3.14” false, a także „-2” i „3E14”. Nie mówiąc już o: „0x10”
Harald Coppoolse,
4
To zależy od typu numeru, który próbujesz sprawdzić. W przypadku liczb całkowitych bez separatora (tj. Ciągów cyfr dziesiętnych) to sprawdzenie działa i jest takie samo jak zaakceptowana odpowiedź i ta sugerowana w OP.
Alex Mazzariol,
1
@Lucas dziękuję za komentarz, nie masz pojęcia, jak długo próbowałem
parsować
Odpowiedzi:
1160
int n;bool isNumeric =int.TryParse("123",out n);
Aktualizacja od C # 7:
var isNumeric =int.TryParse("123",outint n);
lub jeśli nie potrzebujesz numeru, możesz odrzucić parametr out
Chociaż użyłbym double.TryParse, ponieważ chcemy wiedzieć, czy w ogóle reprezentuje liczbę.
John Gietzen
5
Funkcja zwróci true, jeśli przekażę ciąg jako „-123” lub „+123”. Rozumiem, że liczba całkowita ma wartości dodatnie i ujemne. Ale jeśli ten ciąg pochodzi od wpisanego przez użytkownika pola tekstowego, powinien zwrócić wartość false.
user2323308,
9
Jest to dobre rozwiązanie, dopóki użytkownik nie wprowadzi wartości przekraczającej -2 147 483 648 do 2 147 483 647, a potem cicho zawiedzie
BlackTigerX
spróbuj parsować 0,60 (to przecinek!) Jest to niepoprawna liczba, ale zostanie sparsowana jako 60!
Paul Zahra
2
Wolę mieć metodę rozszerzenia dla tego czeku: public static bool IsNumeric(this string text) { double _out; return double.TryParse(text, out _out); }
Hamid Naeemi
350
Zwróci to prawda, jeśli inputwszystkie liczby. Nie wiem, czy jest coś lepszego niż TryParse, ale zadziała.
Regex.IsMatch(input,@"^\d+$")
Jeśli chcesz tylko wiedzieć, czy ma jedną lub więcej cyfr pomieszanych ze znakami, odłóż ^+i $.
Regex.IsMatch(input,@"\d")
Edycja:
Właściwie myślę, że jest lepszy niż TryParse, ponieważ bardzo długi ciąg może potencjalnie przepełnić TryParse.
Jednak zbudowanie wyrażenia regularnego raz na zawsze byłoby znacznie bardziej wydajne.
Clément
2
@CFP +1 ... RegEx są zawsze lepsze niż zwykłe funkcje, jeśli mają zastosowanie!
MAXE
19
@MAXE: Nie zgodziłbym się. Kontrole wyrażeń regularnych są dość powolne, więc często istnieją lepsze rozwiązania, jeśli rozważana jest wydajność.
Michał B.,
7
edycja: możesz dodać RegexOptions.Compiledjako parametr, jeśli używasz ich tysiące w celu ewentualnego zwiększenia prędkościRegex.IsMatch(x.BinNumber, @"^\d+$", RegexOptions.Compiled)
Simon_Weaver
9
zawiedzie także na negatywach i rzeczach z.
Noctis
199
Możesz także użyć:
stringTest.All(char.IsDigit);
Będzie to powrót truedo wszystkich numerycznej cyfry (nie float) i falsejeżeli ciąg wejściowy jest każdy rodzaj alfanumerycznych.
Uwaga : stringTestnie powinien być pustym ciągiem, ponieważ przejdzie test numeryczny.
To bardzo fajnie. Należy jednak pamiętać: pusty ciąg przejdzie ten test jako numeryczny.
dan-gph
2
@ dan-gph: Cieszę się, że ci się podoba. Tak, masz rację. Zaktualizowałem notatkę powyżej. Dzięki!
Kunal Goel
1
nie działa to również w przypadku miejsc dziesiętnych. Właściwym testem będzie stringTest.All (l => char.IsDigit (l) || '.' == l || '-' == l);
Salman Hasrat Khan
Dzięki za wejście Salman, Aby konkretnie sprawdzić liczbę dziesiętną z ciągu, możesz przejść do opcji - if (Decimal.TryParse (stringTest2, wartość wyjściowa)) {/ * Tak, Dziesiętny /} else {/ Nie, Nie dziesiętny * / }
Kunal Goel
6
Salman, to nie jest takie proste - to byłby ..--..--prawidłowy numer. Najwyraźniej nie.
odwoływanie się do Microsoft.VisualBasic.dll z aplikacji C #? eww: P
Lucas
Nie mam problemu z użyciem „IsNumeric”, działa dobrze. Widać również, że istnieje niewielka różnica skuteczności między TryParse a IsNumeric. Pamiętaj, że TryParse jest nowością w wersji 2.0 i wcześniej lepiej było używać IsNumeric niż jakiejkolwiek innej strategii.
Nelson Miranda
10
Cóż, IsNumeric () VB.NET wewnętrznie używa double.TryParse (), po szeregu ruchów, które są potrzebne (między innymi) do kompatybilności z VB6. Jeśli nie potrzebujesz kompatybilności, double.TryParse () jest równie prosty w użyciu i oszczędza ci marnowania pamięci poprzez ładowanie Microsoft.VisualBasic.dll w procesie.
Euro Micelli
4
Szybka uwaga: użycie wyrażenia regularnego będzie znacznie szybsze, jeśli uda ci się zbudować leżącą u podstaw maszynę skończoną raz na zawsze. Zasadniczo budowanie maszyny stanów zajmuje O (2 ^ n), gdzie n jest długością wyrażenia regularnego, podczas gdy odczyt to O (k), gdzie k jest długością przeszukiwanego ciągu. Więc przebudowywanie wyrażenia regularnego za każdym razem wprowadza błąd.
Clément,
2
@Lucas Właściwie jest tam kilka naprawdę fajnych rzeczy, jak pełny parser csv. Nie ma powodu, aby go nie używać, jeśli istnieje.
Nyerguds
32
Jest to prawdopodobnie najlepsza opcja w języku C #.
Jeśli chcesz wiedzieć, czy ciąg zawiera liczbę całkowitą (liczbę całkowitą):
Metoda TryParse spróbuje przekonwertować ciąg na liczbę (liczbę całkowitą), a jeśli się powiedzie, zwróci true i umieści odpowiednią liczbę w myInt. Jeśli nie, zwraca false.
Rozwiązania wykorzystujące int.Parse(someString)alternatywę pokazaną w innych odpowiedziach działają, ale jest znacznie wolniejsze, ponieważ zgłaszanie wyjątków jest bardzo kosztowne. TryParse(...)został dodany do języka C # w wersji 2 i do tego czasu nie miałeś wyboru. Teraz to robisz: dlatego powinieneś unikać Parse()alternatywy.
Jeśli chcesz akceptować liczby dziesiętne, klasa dziesiętna również ma .TryParse(...)metodę. Zamień int na dziesiętny w powyższej dyskusji i obowiązują te same zasady.
Co jeśli mieliby na myśli tylko liczby całkowite? Co z lokalizacjami, w których „.” jest separatorem grupy, a nie przecinkiem (np. pt-Br)? co z liczbami ujemnymi? separatory grup (przecinki w języku angielskim)? symbole walutowe? TryParse () może zarządzać nimi wszystkimi zgodnie z wymaganiami za pomocą NumberStyles i IFormatProvider.
Lucas
O tak, bardziej podoba mi się wersja All. Nigdy tak naprawdę nie korzystałem z tej metody rozszerzenia, dobra rozmowa. Chociaż powinna to być s.ToCharArray (). Wszystkie (..). Jeśli chodzi o twój drugi punkt, słyszę cię, dlatego zdecydowałem się na niego, jeśli nie chcesz używać int.Parse .... (który, jak
zakładam,
11
1.3.3.8.5 nie jest tak naprawdę liczbą, podczas gdy 1.23E5 jest.
Clément,
4
logika jest wadliwa. -1
Russel Yang
1
@Lucas Zgadzam się, że TryParse obsługuje więcej, ale czasami nie jest to potrzebne. Muszę tylko zweryfikować pola numerów kart kredytowych (które mogą zawierać tylko cyfry). To rozwiązanie jest prawie zdecydowanie szybsze niż parsowanie.
// 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);}
Pamiętaj, że fakt, że wartość jest liczbą, nie oznacza, że można ją przekonwertować na typ liczbowy. Na przykład "999999999999999999999999999999.9999999999"jest perfekcyjnie prawidłową wartością numeryczną, ale nie pasuje do typu liczbowego .NET (to znaczy nie zdefiniowanego w standardowej bibliotece).
Nie próbuje być tutaj inteligentnym alecem, ale wydaje się, że zawodzi w przypadku ciągu „0”. Mój Regex nie istnieje. Czy jest na to prosta poprawka? Dostaję „0” i ewentualnie „0,0”, a nawet „-0,0” jako możliwe prawidłowe wartości liczbowe.
Steve Hibbert
@ SteveHibbert - Wszyscy wiedzą, że „0” nie jest liczbą! Poważnie ... skorygował regex, aby dopasować 0.
JDB wciąż pamięta Monikę
Hmmm, czy to ja, czy „0” nadal nie jest rozpoznawane jako numeryczne?
Steve Hibbert,
1
Będąc leniwym i ignorującym wyrażenia regularne, wyciąłem i wkleiłem powyższy kod, który wygląda, jakby zawierał zmianę typu „0.0”. Przeprowadziłem test, aby sprawdzić, czy ciąg „0” działa .IsNumeric () i czy zwraca false. Myślę, że test ósemkowy zwróci prawdę dla wszystkiego, co ma dwa znaki numeryczne, gdzie pierwszy jest równy zero (a drugi wynosi od zera do siódmej), ale zwróci fałsz dla samego dużego, samotnego zera. Jeśli testujesz „0”, używając powyższego kodu, czy otrzymujesz fałsz? Przepraszam, gdybym wiedział więcej wyrażeń regularnych, byłbym w stanie wyrazić lepszą opinię. Musisz przeczytać.
Steve Hibbert
1
! Doh! Po prostu ponownie przeczytaj swój komentarz powyżej, przegapiłem dodatkową gwiazdkę, zaktualizowałem tylko linię dziesiętną. Mając to na miejscu, masz rację, „0” IsNumeric. Przepraszamy za rozgoryczenie i bardzo dziękuję za aktualizację, mam nadzieję, że pomoże to również innym. Bardzo zobowiązany.
Steve Hibbert
14
Wiem, że to stary wątek, ale żadna z odpowiedzi tak naprawdę mi nie zrobiła - ani nieefektywna, ani nie zamknięta w sobie dla łatwego ponownego użycia. Chciałem również upewnić się, że zwróci wartość false, jeśli ciąg znaków był pusty lub zerowy. TryParse zwraca w tym przypadku wartość true (pusty ciąg nie powoduje błędu podczas analizowania jako liczby). Oto moja metoda rozszerzenia ciągu:
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);}}
Prosty w użyciu:
var mystring ="1234.56789";var test = mystring.IsNumeric();
Lub, jeśli chcesz przetestować inne typy liczb, możesz określić „styl”. Aby więc przekonwertować liczbę za pomocą wykładnika, możesz użyć:
var mystring ="5.2453232E6";var test = mystring.IsNumeric(style:NumberStyles.AllowExponent);
Lub, aby przetestować potencjalny ciąg szesnastkowy, możesz użyć:
var mystring ="0xF67AB2";var test = mystring.IsNumeric(style:NumberStyles.HexNumber)
Opcjonalnego parametru „kultura” można używać w podobny sposób.
Ogranicza to to, że nie można konwertować ciągów, które są zbyt duże, aby mogły być zawarte w podwójnym, ale jest to ograniczony wymóg i myślę, że jeśli pracujesz z liczbami większymi niż to, prawdopodobnie będziesz potrzebować dodatkowej specjalistycznej obsługi liczb i tak działa.
Działa świetnie, z tym wyjątkiem, że Double.TryParse nie obsługuje NumberStyles.HexNumber. Zobacz MSDN Double.TryParse. Jakiś powód, dla którego próbujesz TryParse przed sprawdzeniem IsNullOrWhiteSpace? TryParse zwraca wartość false, jeśli IsNullOrWhiteSpace, prawda?
Harald Coppoolse
10
Możesz użyć TryParse, aby ustalić, czy ciąg może zostać przetworzony na liczbę całkowitą.
int i;bool bNum =int.TryParse(str,out i);
Wartość logiczna powie ci, czy zadziałało, czy nie.
zawiera znak dziesiętnyBigIntegers nie parsuje liczb z przecinkiem dziesiętnym. (Więc: BigInteger.Parse("3.3")wyrzuci wyjątek i TryParsedla tego samego zwróci false)
żadnych śmiesznych cyfr
obejmuje przypadki, w których liczba jest większa niż zwykłe użycie Double.TryParse
Będziesz musiał dodać odniesienie do klasy System.Numericsi mieć ją
using System.Numerics;na szczycie (cóż, chyba druga to bonus :)
Myślę, że ta odpowiedź zostanie po prostu zagubiona między wszystkimi innymi, ale tak czy inaczej, proszę bardzo.
Skończyło się na tym pytaniu przez Google, ponieważ chciałem sprawdzić, czy stringbyło numerictak, że mogę po prostu użyć double.Parse("123")zamiast TryParse()metody.
Dlaczego? Ponieważ denerwujące jest zadeklarowanie outzmiennej i sprawdzenie wyniku, TryParse()zanim dowiesz się, czy parsowanie się nie powiodło. Chcę użyć polecenia, ternary operatoraby sprawdzić, czy stringjest, numericala następnie po prostu parsować je w pierwszym wyrażeniu trójskładnikowym lub podać wartość domyślną w drugim wyrażeniu trójskładnikowym.
Lubię to:
var doubleValue =IsNumeric(numberAsString)?double.Parse(numberAsString):0;
Jest po prostu o wiele czystszy niż:
var doubleValue =0;if(double.TryParse(numberAsString,out doubleValue)){//whatever you want to do with doubleValue}
Zrobiłem parę extension methodsdla tych przypadków:
Ponieważ IsParseableAs()próba przetworzenia łańcucha jako odpowiedniego typu zamiast tylko sprawdzenia, czy łańcuch jest „numeryczny”, powinna być całkiem bezpieczna. I możesz go nawet używać do typów nienumerycznych, które mają taką TryParse()metodę DateTime.
Metoda wykorzystuje refleksję i ostatecznie wywołujesz TryParse()metodę dwukrotnie, co oczywiście nie jest tak wydajne, ale nie wszystko musi być w pełni zoptymalizowane, czasami wygoda jest po prostu ważniejsza.
Tej metody można także użyć do łatwego parsowania listy ciągów liczbowych na listę doublelub inny typ z wartością domyślną bez wychwytywania jakichkolwiek wyjątków:
var sNumbers =new[]{"10","20","30"};var dValues = sNumbers.Select(s => s.IsParseableAs<double>()?double.Parse(s):0);
Ta metoda rozszerzenia pozwala przeanalizować stringjak każdy, typektóry ma TryParse()metodę, a także pozwala określić wartość domyślną, która ma zostać zwrócona, jeśli konwersja się nie powiedzie.
Jest to lepsze niż użycie operatora trójskładnikowego z powyższą metodą rozszerzenia, ponieważ dokonuje konwersji tylko raz. Nadal jednak używa refleksji ...
Wierzę, że wymyśliłeś jedno z najbardziej nieefektywnych podejść, jakie do tej pory widziałem. Nie tylko parsujesz łańcuch dwa razy (w przypadku, gdy jest on parsowalny), ale także wywołujesz wielokrotnie funkcje odbicia, aby to zrobić. I na koniec, nawet nie zapisujesz żadnych naciśnięć klawiszy przy użyciu metody rozszerzenia.
JDB wciąż pamięta Monikę
Dziękuję za powtórzenie tego, co sam napisałem w akapicie od drugiego do ostatniego. Również biorąc pod uwagę mój ostatni przykład, zdecydowanie oszczędzasz naciśnięcia klawiszy przy użyciu tej metody rozszerzenia. Ta odpowiedź nie twierdzi, że jest jakimś magicznym rozwiązaniem jakiegokolwiek problemu, jest jedynie przykładem kodu. Użyj go lub nie używaj go. Myślę, że jest to wygodne, gdy jest właściwie stosowane. I zawiera przykłady metod rozszerzenia i refleksji, być może ktoś może się z tego nauczyć.
Hein Andre Grønnestad
5
Próbowałeś var x = double.TryParse("2.2", new double()) ? double.Parse("2.2") : 0.0;?
JDB wciąż pamięta Monikę
2
Tak i to nie działa. Argument 2 must be passed with the 'out' keywordi jeśli określisz outtak dobrze, jak newdostaniesz A ref or out argument must be an assignable variable.
Hein Andre Grønnestad,
1
Wydajność TryParse jest lepsza niż wszystkie dostępne tutaj. Wyniki: TryParse 8 Regex 20 PHP IsNumeric 30 Refleksje TryParse 31 Kod testowy dotnetfiddle.net/x8GjAF
prampe
7
Jeśli chcesz wiedzieć, czy ciąg jest liczbą, zawsze możesz spróbować go parsować:
var numberString ="123";int number;int.TryParse(numberString ,out number);
Zauważ, że TryParsezwraca a bool, którego możesz użyć do sprawdzenia, czy parsowanie się powiodło.
Najlepsze elastyczne rozwiązanie z wbudowaną funkcją .net o nazwie- char.IsDigit. Działa z nieograniczoną liczbą długich. Zwróci prawdę tylko wtedy, gdy każdy znak jest liczbą. Używałem go wiele razy bez problemów i znacznie łatwiejsze rozwiązanie, jakie kiedykolwiek znalazłem. Zrobiłem przykładową metodę. Jest gotowy do użycia. Ponadto dodałem sprawdzanie poprawności dla pustych i pustych danych wejściowych. Ta metoda jest teraz całkowicie kuloodporna
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;}}}
Skorzystaj z tych metod rozszerzenia, aby wyraźnie rozróżnić między sprawdzaniem, czy łańcuch jest numeryczny i czy łańcuch zawiera tylko 0–9 cyfr
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;}
Pobierz w swoim projekcie odniesienie do języka Visual Basic i użyj jego metody Information.IsNumeric, takiej jak pokazano poniżej, i możesz przechwytywać liczby zmiennoprzecinkowe, a także liczby całkowite, w przeciwieństwie do powyższej odpowiedzi, która wyłapuje tylko liczby całkowite.
// Using Microsoft.VisualBasic;var txt ="ABCDEFG";if(Information.IsNumeric(txt))Console.WriteLine("Numeric");IsNumeric("12.3");// trueIsNumeric("1");// trueIsNumeric("abc");// false
Potencjalnym problemem związanym z tym podejściem jest IsNumericanaliza znaków w łańcuchu. Liczba taka 9999999999999999999999999999999999999999999999999999999999.99999999999zarejestruje się jako True, mimo że nie ma możliwości reprezentowania tej liczby przy użyciu standardowego typu numerycznego.
Wszystkie odpowiedzi są przydatne. Ale podczas szukania rozwiązania, w którym wartość liczbowa wynosi 12 cyfr lub więcej (w moim przypadku), a następnie podczas debugowania znalazłem przydatne rozwiązanie:
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;}
Cztery głosy negatywne, ale nikt nie powiedział dlaczego? Przypuszczam, że to dlatego, że TryParse / Parse byłoby lepszą opcją, ale nie wszyscy, którzy tu przyjdą, będą o tym wiedzieć.
njplumridge
2
Sprawiłeś,
1. Nie ma powodu, aby czytać DWIE liczby z konsoli i dodawać je. To, skąd pochodzi ten ciąg znaków, nie ma znaczenia, więc nie ma powodu, aby w ogóle czytać z konsoli.
Algoman
2. Zmienna dla f jest niepotrzebna, możesz zwrócić 0 lub 1 bezpośrednio - jeśli chcesz pojedynczy zwrot, możesz do tego użyć operatora trójskładnikowego. int jest również niewłaściwym typem zwrotu dla find, powinien być bool i możesz zwrócić s == s1
Algoman
3. kopiujesz cyfry s na s1, a następnie porównujesz s do s1. Jest to o wiele wolniejsze, niż trzeba. Również dlaczego kontynuujesz wewnętrzną pętlę, nawet jeśli zdarzyło się c [0] == s [i]? Czy oczekujesz, że s [i] będzie równy również innym cyfrom?
Odpowiedzi:
Aktualizacja od C # 7:
lub jeśli nie potrzebujesz numeru, możesz odrzucić parametr out
W var s mogą być zastąpione przez ich rodzajów!
źródło
public static bool IsNumeric(this string text) { double _out; return double.TryParse(text, out _out); }
Zwróci to prawda, jeśli
input
wszystkie liczby. Nie wiem, czy jest coś lepszego niżTryParse
, ale zadziała.Jeśli chcesz tylko wiedzieć, czy ma jedną lub więcej cyfr pomieszanych ze znakami, odłóż
^
+
i$
.Edycja: Właściwie myślę, że jest lepszy niż TryParse, ponieważ bardzo długi ciąg może potencjalnie przepełnić TryParse.
źródło
RegexOptions.Compiled
jako parametr, jeśli używasz ich tysiące w celu ewentualnego zwiększenia prędkościRegex.IsMatch(x.BinNumber, @"^\d+$", RegexOptions.Compiled)
.
Możesz także użyć:
Będzie to powrót
true
do wszystkich numerycznej cyfry (niefloat
) ifalse
jeżeli ciąg wejściowy jest każdy rodzaj alfanumerycznych.Uwaga :
stringTest
nie powinien być pustym ciągiem, ponieważ przejdzie test numeryczny.źródło
..--..--
prawidłowy numer. Najwyraźniej nie.Użyłem tej funkcji kilka razy:
Ale możesz także użyć;
Z analizy porównawczej IsNumeric Options
(źródło: aspalliance.com )
(źródło: aspalliance.com )
źródło
Jest to prawdopodobnie najlepsza opcja w języku C #.
Jeśli chcesz wiedzieć, czy ciąg zawiera liczbę całkowitą (liczbę całkowitą):
Metoda TryParse spróbuje przekonwertować ciąg na liczbę (liczbę całkowitą), a jeśli się powiedzie, zwróci true i umieści odpowiednią liczbę w myInt. Jeśli nie, zwraca false.
Rozwiązania wykorzystujące
int.Parse(someString)
alternatywę pokazaną w innych odpowiedziach działają, ale jest znacznie wolniejsze, ponieważ zgłaszanie wyjątków jest bardzo kosztowne.TryParse(...)
został dodany do języka C # w wersji 2 i do tego czasu nie miałeś wyboru. Teraz to robisz: dlatego powinieneś unikaćParse()
alternatywy.Jeśli chcesz akceptować liczby dziesiętne, klasa dziesiętna również ma
.TryParse(...)
metodę. Zamień int na dziesiętny w powyższej dyskusji i obowiązują te same zasady.źródło
Zawsze możesz użyć wbudowanych metod TryParse dla wielu typów danych, aby sprawdzić, czy dany ciąg przejdzie.
Przykład.
Wynik będzie wtedy = Prawda
Wynik wtedy = Fałsz
źródło
Jeśli nie chcesz używać int.Parse lub double.Parse, możesz rzucić własny za pomocą czegoś takiego:
źródło
Jeśli chcesz wyłapać szersze spektrum liczb, à_numeric PHP , możesz użyć następujących opcji:
Test jednostkowy:
Pamiętaj, że fakt, że wartość jest liczbą, nie oznacza, że można ją przekonwertować na typ liczbowy. Na przykład
"999999999999999999999999999999.9999999999"
jest perfekcyjnie prawidłową wartością numeryczną, ale nie pasuje do typu liczbowego .NET (to znaczy nie zdefiniowanego w standardowej bibliotece).źródło
Wiem, że to stary wątek, ale żadna z odpowiedzi tak naprawdę mi nie zrobiła - ani nieefektywna, ani nie zamknięta w sobie dla łatwego ponownego użycia. Chciałem również upewnić się, że zwróci wartość false, jeśli ciąg znaków był pusty lub zerowy. TryParse zwraca w tym przypadku wartość true (pusty ciąg nie powoduje błędu podczas analizowania jako liczby). Oto moja metoda rozszerzenia ciągu:
Prosty w użyciu:
Lub, jeśli chcesz przetestować inne typy liczb, możesz określić „styl”. Aby więc przekonwertować liczbę za pomocą wykładnika, możesz użyć:
Lub, aby przetestować potencjalny ciąg szesnastkowy, możesz użyć:
Opcjonalnego parametru „kultura” można używać w podobny sposób.
Ogranicza to to, że nie można konwertować ciągów, które są zbyt duże, aby mogły być zawarte w podwójnym, ale jest to ograniczony wymóg i myślę, że jeśli pracujesz z liczbami większymi niż to, prawdopodobnie będziesz potrzebować dodatkowej specjalistycznej obsługi liczb i tak działa.
źródło
Możesz użyć TryParse, aby ustalić, czy ciąg może zostać przetworzony na liczbę całkowitą.
Wartość logiczna powie ci, czy zadziałało, czy nie.
źródło
Jeśli chcesz sprawdzić, czy ciąg jest liczbą (zakładam, że jest to ciąg, ponieważ jeśli jest to liczba, duh, wiesz, że to jeden).
możesz także:
Zajmie się to zwykłymi nieprzyjemnościami:
zawiera znak dziesiętnyBigIntegers nie parsuje liczb z przecinkiem dziesiętnym. (Więc:BigInteger.Parse("3.3")
wyrzuci wyjątek iTryParse
dla tego samego zwróci false)Double.TryParse
Będziesz musiał dodać odniesienie do klasy
System.Numerics
i mieć jąusing System.Numerics;
na szczycie (cóż, chyba druga to bonus :)źródło
Myślę, że ta odpowiedź zostanie po prostu zagubiona między wszystkimi innymi, ale tak czy inaczej, proszę bardzo.
Skończyło się na tym pytaniu przez Google, ponieważ chciałem sprawdzić, czy
string
byłonumeric
tak, że mogę po prostu użyćdouble.Parse("123")
zamiastTryParse()
metody.Dlaczego? Ponieważ denerwujące jest zadeklarowanie
out
zmiennej i sprawdzenie wyniku,TryParse()
zanim dowiesz się, czy parsowanie się nie powiodło. Chcę użyć polecenia,ternary operator
aby sprawdzić, czystring
jest,numerical
a następnie po prostu parsować je w pierwszym wyrażeniu trójskładnikowym lub podać wartość domyślną w drugim wyrażeniu trójskładnikowym.Lubię to:
Jest po prostu o wiele czystszy niż:
Zrobiłem parę
extension methods
dla tych przypadków:Metoda rozszerzenia 1
Przykład:
Ponieważ
IsParseableAs()
próba przetworzenia łańcucha jako odpowiedniego typu zamiast tylko sprawdzenia, czy łańcuch jest „numeryczny”, powinna być całkiem bezpieczna. I możesz go nawet używać do typów nienumerycznych, które mają takąTryParse()
metodęDateTime
.Metoda wykorzystuje refleksję i ostatecznie wywołujesz
TryParse()
metodę dwukrotnie, co oczywiście nie jest tak wydajne, ale nie wszystko musi być w pełni zoptymalizowane, czasami wygoda jest po prostu ważniejsza.Tej metody można także użyć do łatwego parsowania listy ciągów liczbowych na listę
double
lub inny typ z wartością domyślną bez wychwytywania jakichkolwiek wyjątków:Metoda rozszerzenia dwa
Ta metoda rozszerzenia pozwala przeanalizować
string
jak każdy,type
który maTryParse()
metodę, a także pozwala określić wartość domyślną, która ma zostać zwrócona, jeśli konwersja się nie powiedzie.Jest to lepsze niż użycie operatora trójskładnikowego z powyższą metodą rozszerzenia, ponieważ dokonuje konwersji tylko raz. Nadal jednak używa refleksji ...
Przykłady:
Wyjścia:
źródło
var x = double.TryParse("2.2", new double()) ? double.Parse("2.2") : 0.0;
?Argument 2 must be passed with the 'out' keyword
i jeśli określiszout
tak dobrze, jaknew
dostanieszA ref or out argument must be an assignable variable
.Jeśli chcesz wiedzieć, czy ciąg jest liczbą, zawsze możesz spróbować go parsować:
Zauważ, że
TryParse
zwraca abool
, którego możesz użyć do sprawdzenia, czy parsowanie się powiodło.źródło
Double.TryParse
źródło
AKTUALIZACJA Kunal Noel Answer
Ale w tym przypadku mamy puste łańcuchy, które przejdą ten test, więc możesz:
źródło
Najlepsze elastyczne rozwiązanie z wbudowaną funkcją .net o nazwie-
char.IsDigit
. Działa z nieograniczoną liczbą długich. Zwróci prawdę tylko wtedy, gdy każdy znak jest liczbą. Używałem go wiele razy bez problemów i znacznie łatwiejsze rozwiązanie, jakie kiedykolwiek znalazłem. Zrobiłem przykładową metodę. Jest gotowy do użycia. Ponadto dodałem sprawdzanie poprawności dla pustych i pustych danych wejściowych. Ta metoda jest teraz całkowicie kuloodpornaźródło
Za pomocą c # 7 można wstawić zmienną out:
źródło
Skorzystaj z tych metod rozszerzenia, aby wyraźnie rozróżnić między sprawdzaniem, czy łańcuch jest numeryczny i czy łańcuch zawiera tylko 0–9 cyfr
źródło
źródło
Mam nadzieję że to pomoże
źródło
Pobierz w swoim projekcie odniesienie do języka Visual Basic i użyj jego metody Information.IsNumeric, takiej jak pokazano poniżej, i możesz przechwytywać liczby zmiennoprzecinkowe, a także liczby całkowite, w przeciwieństwie do powyższej odpowiedzi, która wyłapuje tylko liczby całkowite.
źródło
IsNumeric
analiza znaków w łańcuchu. Liczba taka9999999999999999999999999999999999999999999999999999999999.99999999999
zarejestruje się jakoTrue
, mimo że nie ma możliwości reprezentowania tej liczby przy użyciu standardowego typu numerycznego.Wypróbuj poniższe reguły
źródło
Wszystkie odpowiedzi są przydatne. Ale podczas szukania rozwiązania, w którym wartość liczbowa wynosi 12 cyfr lub więcej (w moim przypadku), a następnie podczas debugowania znalazłem przydatne rozwiązanie:
Zmienna wynikowa da ci wartość prawda lub fałsz.
źródło
Oto metoda C #. Metoda Int.TryParse (String, Int32)
źródło
źródło