Jaki jest najbardziej efektywny sposób testowania ciągu wejściowego, niezależnie od tego, czy zawiera on wartość liczbową (lub odwrotnie, nie jest liczbą)? Myślę, że mogę użyć Double.Parse
wyrażenia regularnego lub (patrz poniżej), ale zastanawiałem się, czy jest jakiś wbudowany sposób, aby to zrobić, na przykład javascript NaN()
lub IsNumeric()
( czy to VB, nie pamiętam?).
public static bool IsNumeric(this string value)
{
return Regex.IsMatch(value, "^\\d+$");
}
Odpowiedzi:
To nie ma narzutu wyrażenia regularnego
Nawiasem mówiąc, wszystkie standardowe typy danych, z rażącym wyjątkiem identyfikatorów GUID, obsługują TryParse.
update
secretwep podniósł, że wartość „2345” przejdzie powyższy test jako liczba. Jeśli jednak chcesz się upewnić, że wszystkie znaki w ciągu są cyframi, należy zastosować inne podejście.
Przykład 1 :
lub jeśli chcesz być trochę bardziej fantazyjny
aktualizacja 2 (z @stackonfire, aby poradzić sobie z pustymi lub pustymi ciągami)
źródło
Number
obiekt w JavaScript to liczba zmiennoprzecinkowa lub liczba całkowita, więc zmiana na double.TryParse byłaby dokładniejszym odpowiednikiemdouble
, ale wielu uważa, że nie są one numeryczne.public Boolean IsNumber(String s) { Boolean value = true; if (s == String.Empty || s == null) { value=false; } else { foreach(Char c in s.ToCharArray()) { value = value && Char.IsDigit(c); } } return value; }
Wolę coś takiego, pozwala ci zdecydować, na co
NumberStyle
przetestować.źródło
Oprócz poprzednich poprawnych odpowiedzi warto prawdopodobnie zwrócić uwagę, że „Not a Number” (NaN) w swoim ogólnym zastosowaniu nie jest równoważne z ciągiem znaków, którego nie można ocenić jako wartości liczbowej. NaN jest zwykle rozumiane jako wartość liczbowa używana do przedstawienia wyniku „niemożliwego” obliczenia - w przypadku gdy wynik jest nieokreślony. W związku z tym powiedziałbym, że użycie Javascript jest nieco mylące. W języku C # NaN jest zdefiniowane jako właściwość pojedynczych i podwójnych typów numerycznych i jest używane do wyraźnego odniesienia się do wyniku nurkowania zero przez zero. Inne języki używają go do reprezentowania różnych „niemożliwych” wartości.
źródło
Wiem, że odpowiedzi udzielono na wiele różnych sposobów, z rozszerzeniami i przykładami lambda, ale kombinacją obu dla najprostszego rozwiązania.
lub jeśli używasz programu Visual Studio 2015 (C # 6,0 lub nowszego)
Niesamowity C # 6 w jednej linii. Oczywiście jest to ograniczone, ponieważ sprawdza tylko dla znaków numerycznych.
Aby użyć, wystarczy mieć ciąg znaków i wywołać na nim metodę, na przykład:
źródło
Tak, IsNumeric to VB. Zwykle ludzie używają metody TryParse (), chociaż jest ona nieco niezgrabna. Jak zasugerowałeś, zawsze możesz napisać własny.
źródło
Podoba mi się metoda rozszerzenia, ale nie lubię rzucać wyjątków, jeśli to możliwe. Zdecydowałem się na metodę rozszerzenia, biorąc tutaj najlepszą z 2 odpowiedzi.
źródło
Nadal możesz używać funkcji Visual Basic w języku C #. Jedyne, co musisz zrobić, to postępować zgodnie z poniższymi instrukcjami:
Następnie zaimportuj go do swojej klasy, jak pokazano poniżej:
przy użyciu Microsoft.VisualBasic;
Następnie użyj go w dowolnym miejscu, jak pokazano poniżej:
Mam nadzieję, że to pomaga i powodzenia!
źródło
VB ma
IsNumeric
funkcję. Możesz się odwołaćMicrosoft.VisualBasic.dll
i użyć.źródło
Proste rozszerzenie:
źródło
źródło
Może to jest funkcja C # 3, ale możesz użyć
double.NaN
.źródło
W rzeczywistości
Double.NaN
jest obsługiwany we wszystkich wersjach .NET 2.0 i nowszych.źródło
Używałem fragmentu Chrisa Lively'ego (wybrana odpowiedź) zamkniętego w funkcji bool, takiej jak sugestia Gishu, przez rok lub dwa. Użyłem go, aby upewnić się, że niektóre ciągi zapytań są tylko numeryczne przed przystąpieniem do dalszego przetwarzania. Zacząłem otrzymywać błędne zapytania, których oznaczona odpowiedź nie obsługiwała, szczególnie za każdym razem, gdy przecinek został przekazany po liczbie takiej jak „3645” (zwrócona prawda). Oto wynikowy mod:
źródło
Double.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out myNum)
Mam nieco inną wersję, która zwraca liczbę. Domyślam się, że w większości przypadków po przetestowaniu ciągu chciałbyś użyć liczby.
źródło
To zmodyfikowana wersja rozwiązania zaproponowanego przez pana Siira. Uważam, że dodanie metody rozszerzenia jest najlepszym rozwiązaniem do ponownego użycia i prostoty metody wywoływania.
Zmodyfikowałem treść metody, aby pasowała do 2 wierszy i usunąłem niepotrzebną implementację .ToString (). Dla tych, którzy nie są zaznajomieni z metodami rozszerzającymi, oto jak zaimplementować:
Utwórz plik klasy o nazwie ExtensionMethods . Wklej ten kod:
Zastąp YourNameSpaceHere rzeczywistą przestrzenią nazw. Zapisz zmiany. Teraz możesz korzystać z metody rozszerzenia w dowolnym miejscu aplikacji:
Uwaga: ta metoda zwróci wartość true dla liczb całkowitych i dziesiętnych, ale zwróci wartość false, jeśli ciąg zawiera przecinek. Jeśli chcesz akceptować dane wejściowe za pomocą przecinków lub symboli, takich jak „$”, sugerowałbym najpierw zaimplementowanie metody usuwania tych znaków, a następnie przetestowanie, czy IsNumeric.
źródło