2013-08-15 26 views
16

Voglio solo sapere se una variabile di stringa contiene un valore intero positivo analizzabile. NON voglio analizzare il valore adesso.In C#, come verificare se una stringa contiene un intero?

Attualmente sto facendo:

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

Questo è brutto - come essere più conciso?

Nota: conosco i metodi di estensione, ma mi chiedo se c'è qualcosa di integrato.

+1

È necessario consentire numeri negativi? –

+3

Mantieni il codice che hai e vivi con la bruttezza. –

+0

@MatthewWatson Grazie per aver notato questo. È positivo solo nel mio caso, ha chiarito la domanda. – Marcel

risposta

3

La risposta sembra essere proprio no.

Anche se ci sono molte altre buone risposte, o nascondono la bruttura (che non ho chiesto) o introducono nuovi problemi (casi limite).

+0

Immagino che i progettisti di C# potrebbero introdurre qualche nuovo zucchero sintattico per questo caso in cui non ci interessa la variabile out. Potrebbe sembrare 'int.TryParse (myStringVariable, out void)' o qualcosa del genere. Il compilatore dovrebbe quindi introdurre automaticamente una variabile locale "generata" del tipo corretto, ma non apparirebbe brutta nel codice. Ovviamente la variabile generata non sarebbe accessibile (dovrebbe avere un nome illegale "pazzo"). –

22

si Supponendo che desidera controllare che tutti i caratteri nella stringa sono cifre, è possibile utilizzare il Enumerable.All Extension Method con la Char.IsDigit Method come segue:

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

Cosa succede se 'MyStringVariable' contiene caratteri numerici di molti" script "diversi da tutto il mondo, come numeri indù-arabi combinati con numeri occidentali? –

+0

In tal caso, "222" darà true, ma analizzandolo come un int genererà un'eccezione. –

+0

Se si desidera verificare se uno dei caratteri fosse numerico e non tutti, è possibile utilizzare - bool anyCharactersInStringAreDigits = myStringVariable.Any (char.IsDigit); – Deano

0

Siamo spiacenti, non riusciva a ottenere la vostra domanda. Quindi qualcosa del genere?

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

Oppure il valore deve essere un numero intero completamente, senza stringhe aggiuntive?

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

Cosa restituirebbe la seconda risposta per '-----'? – I4V

+0

@SBoss Dovrebbe essere esattamente analizzabile come int, ma voglio solo ora che non sia il risultato del valore di analisi. – Marcel

+0

Ho appena capito che;) – SBoss

5

È possibile controllare se la stringa contiene solo numeri:

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

ma il numero può essere più grande di Int32.MaxValue o meno di Int32.MinValue - si dovrebbe tenere a mente.

Un'altra opzione - creare metodo di estensione e spostare codice brutto c'è:

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

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

che renderà il codice più pulito:

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

+1 per il suggerimento Min/Max. –

+0

risposta diretta –

17

Si potrebbe utilizzare char.IsDigit:

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

Restituirà true se la stringa è un numero

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

tornerà true se la stringa contiene una cifra

+2

Se 'str' è uguale a' "iuhs,./Hu3dwuh" ', allora' str.Any (char.IsDigit) 'sarà vero. –

+1

Non sono il downvoter, ma 1. Non c'è una funzione statica nella classe 'string' chiamata' Any' (presumibilmente si intendeva che la variabile stringa fosse chiamata 'string', ma non è possibile); 2. Se ti riferisci al metodo di estensione Linq 'Any', devi chiamarlo come questo:' s.Any (c => char.IsDigit (c)) '; 3. Penso che voglia che la stringa * whole * sia un intero, non solo per contenere una cifra da qualche parte; altrimenti non ha senso per lui usare 'int.TryParse'. –

+4

@MagnusGrindalBakken Per quanto riguarda il tuo (2): No, dal momento che il tipo di firma e di ritorno è corretto, l'espressione 'char.IsDigit' (un cosiddetto gruppo di metodi) _can_ deve essere convertita in tipo' Func ' attraverso una conversione implicita, quindi quella parte è OK. –

3

Forse questo può aiutare

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

risposta da msdn.