2013-08-15 21 views
16

Po prostu chcę wiedzieć, czy zmienna String zawiera parsowalną dodatnią wartość całkowitą. NIE chcę teraz analizować wartości.W języku C#, jak sprawdzić, czy ciąg zawiera liczbę całkowitą?

Obecnie robie:

int parsedId; 
if (
    (String.IsNullOrEmpty(myStringVariable) || 
    (!uint.TryParse(myStringVariable, out parsedId)) 
) 
{//..show error message} 

To jest brzydki - Jak być bardziej zwięzły?

Uwaga: Wiem o metodach rozszerzania, ale zastanawiam się, czy jest coś wbudowanego.

+1

Czy musisz zezwalać na liczby ujemne? –

+3

Trzymaj kod, który masz, i żyj z brzydotą. –

+0

@MatthewWatson Dzięki za spostrzeżenie. Jest to pozytywne tylko w moim przypadku, wyjaśniłem pytanie. – Marcel

Odpowiedz

3

Odpowiedź wydaje się być po prostu nie ma.

Chociaż istnieje wiele dobrych innych odpowiedzi, po prostu ukrywają brzydotę (o co nie prosiłem) lub wprowadzają nowe problemy (przypadki krańcowe).

+0

Myślę, że projektanci C# mogliby wprowadzić nowy cukier syntaktyczny dla tego przypadku, w którym nie zależy nam na zmiennej out. Może wyglądać jak 'int.TryParse (myStringVariable, out void)' lub coś podobnego. Kompilator powinien następnie automatycznie wprowadzić "wygenerowaną" zmienną lokalną właściwego typu, ale nie będzie wyglądać brzydko w kodzie. Oczywiście wygenerowana zmienna nie byłaby dostępna (powinna mieć "szaloną" nielegalną nazwę). –

22

Zakładając chcesz sprawdzić, czy wszystkie znaki w ciągu są cyfry, można użyć Enumerable.All Extension Method z Char.IsDigit Method następująco:

bool allCharactersInStringAreDigits = myStringVariable.All(char.IsDigit); 
+1

Co jeśli "myStringVariable" zawiera cyfry z wielu różnych "skryptów" z całego świata, takich jak cyfry hindusko-arabskie w połączeniu z cyframi zachodnimi? –

+0

W takim przypadku "222" da wartość true, ale parsowanie jej jako int spowoduje wyjątek. –

+0

Jeśli chcesz sprawdzić, czy któryś ze znaków jest numeryczny, a nie wszystkie, możesz użyć - bool anyCharactersInStringAreDigits = myStringVariable.Any (char.IsDigit); – Deano

0

Niestety, nie dość dostać swoje pytanie. Coś w tym stylu?

str.ToCharArray().Any(char.IsDigit); 

A może wartość musi być całkowitą całkowicie, bez żadnych dodatkowych ciągów?

if(str.ToCharArray().All(char.IsDigit(c)); 
+0

Jaka byłaby twoja druga odpowiedź dla '-----'? – I4V

+0

@SBoss To powinno być dokładnie parsable jako int, ale ja po prostu chcę to teraz, nie wynik wartości parsowania. – Marcel

+0

Właśnie zdałem sobie sprawę, że;) – SBoss

5

Można sprawdzić, czy ciąg zawiera tylko liczby:

Regex.IsMatch(myStringVariable, @"^-?\d+$") 

Ale liczba może być większa niż Int32.MaxValue lub mniej niż Int32.MinValue - należy o tym pamiętać.

Inna opcja - utworzyć metodę rozszerzenia i przenieść brzydkiego kodu tam:

public static bool IsInteger(this string s) 
{ 
    if (String.IsNullOrEmpty(s)) 
     return false; 

    int i; 
    return Int32.TryParse(s, out i); 
} 

które uczynią twój kod bardziej czysty:

if (myStringVariable.IsInteger()) 
    // ... 
+2

+1 dla wskazówki Min/Max. –

+0

bezpośrednia odpowiedź –

17

można użyć char.IsDigit:

 bool isIntString = "your string".All(char.IsDigit) 

Zwróci true, jeśli ciąg znaków jest liczbą

bool containsInt = "your string".Any(char.IsDigit) 

Wrócimy true jeśli ciąg zawiera cyfrę

+2

Jeśli 'str' jest równe' "iuh,./Hu3dwuh" ', wtedy' str.Any (char.IsDigit) 'będzie prawdziwe. –

+1

Nie jestem downvoter, ale 1. Nie ma funkcji statycznej w klasie 'string' zwanej' Any' (prawdopodobnie chodziło o to, aby zmienna łańcuchowa miała nazwę 'string', ale to nie jest możliwe); 2. Jeśli odnosisz się do metody rozszerzenia Linq "Any", musisz nazwać ją liks to: 's.Any (c => char.IsDigit (c))'; 3. Myślę, że chce, aby ciąg * cały * był liczbą całkowitą, a nie tylko by gdzieś zawierał cyfrę; w przeciwnym razie nie ma sensu używać 'int.TryParse'. –

+4

@MagnusGrindalBakken Odnosząc się do twojego (2): Nie, ponieważ typ podpisu i zwrotu jest poprawny, wyrażenie 'char.IsDigit' (tak zwana grupa metod) _can_ może zostać przekonwertowane na typ' Func 'poprzez niejawną konwersję, więc ta część jest w porządku. –

3

Może to pomoże

string input = "hello123world"; 
bool isDigitPresent = input.Any(c => char.IsDigit(c)); 

odpowiedź od msdn.