Identificare se una stringa è un numero


731

Se ho queste stringhe:

  1. "abc" = false

  2. "123" = true

  3. "ab2" = false

Esiste un comando, come IsNumeric()o qualcos'altro, che può identificare se una stringa è un numero valido?


79
dai loro esempi puoi vedere che intendevano dire se l' intera stringa rappresenta un numero.
Lucas,

47
return str.All (Char.IsDigit);
Mohsen,

13
str.All (Char.IsDigit) dichiarerà "3.14" falso nonché "-2" e "3E14". Per non parlare di "0x10"
Harald Coppoolse,

4
Dipende dal tipo di numero che si sta tentando di verificare. Per i numeri interi senza separatore (ovvero stringhe di cifre decimali) questo controllo funziona ed è lo stesso della risposta accettata e di quella implicita in OP.
Alex Mazzariol,

1
@Lucas grazie per il tuo commento, non hai idea da quanto tempo sto cercando di analizzare una stringa doppia come int e chiedendomi perché non ci sia riuscita ...
Novastorm

Risposte:


1160
int n;
bool isNumeric = int.TryParse("123", out n);

Aggiornamento a partire da C # 7:

var isNumeric = int.TryParse("123", out int n);

o se non hai bisogno del numero puoi scartare il parametro out

var isNumeric = int.TryParse("123", out _);

I var possono essere sostituiti dai rispettivi tipi!


126
Tuttavia, userei double. TryParse, poiché vogliamo sapere se rappresenta un numero.
John Gietzen,

5
La funzione restituirà true se passo la stringa come "-123" o "+123". Capisco che l'intero ha valori positivi e negativi. Ma se questa stringa proviene dalla casella di testo immessa dall'utente, dovrebbe restituire false.
user2323308,

9
Questa è una buona soluzione, fino a quando un utente non immette un valore compreso tra -2.147.483.648 e 2.147.483.647, e quindi ciò fallisce silenziosamente
BlackTigerX,

prova ad analizzare 0,60 (che è una virgola!) è un numero non valido ma verrà analizzato come 60!
Paul Zahra,

2
Preferisco avere un metodo di estensione per questo controllo: public static bool IsNumeric(this string text) { double _out; return double.TryParse(text, out _out); }
Hamid Naeemi,

350

Questo restituirà vero se inputsono tutti i numeri. Non so se è meglio di TryParse, ma funzionerà.

Regex.IsMatch(input, @"^\d+$")

Se vuoi solo sapere se ha uno o più numeri mescolati con i caratteri, lascia ^ +e $.

Regex.IsMatch(input, @"\d")

Modifica: in realtà penso che sia meglio di TryParse perché una stringa molto lunga potrebbe potenzialmente traboccare TryParse.


2
Costruire la regex una volta per tutte sarebbe comunque molto più efficiente.
Clément,

2
@CFP +1 ... RegEx sono sempre migliori delle normali funzioni, quando applicabile!
MAXE

19
@MAXE: non sarei d'accordo. I controlli delle espressioni regolari sono piuttosto lenti, quindi spesso ci sono soluzioni migliori se si prendono in considerazione le prestazioni.
Michal B.

7
modifica: puoi aggiungere RegexOptions.Compiledcome parametro se ne stai eseguendo migliaia per un possibile aumento di velocitàRegex.IsMatch(x.BinNumber, @"^\d+$", RegexOptions.Compiled)
Simon_Weaver

9
fallirà anche su aspetti negativi e cose con.
Noctis,

199

Puoi anche usare:

stringTest.All(char.IsDigit);

Restituirà trueper tutte le cifre numeriche (non float) e falsese la stringa di input è qualsiasi tipo di alfanumerico.

Nota : stringTestnon deve essere una stringa vuota poiché supererebbe il test di essere numerico.


20
È molto bello. Una cosa da tenere presente però: una stringa vuota supererà quel test come numerico.
dan-gph,

2
@ dan-gph: sono contento, ti piace. Sì hai ragione. Ho aggiornato la nota sopra. Grazie!
Kunal Goel,

1
anche questo non funziona per i casi decimali. Il test giusto sarà stringTest.All (l => char.IsDigit (l) || '.' == l || '-' == l);
Salman Hasrat Khan,

Grazie per il tuo input Salman, per verificare in modo specifico il decimale da una stringa, puoi scegliere - if (Decimal. TryParse (stringTest2, valore out)) {/ * Sì, Decimale /} else {/ No, Not a Decimal * / }
Kunal Goel,

6
Salman, non è così semplice, questo passerebbe ..--..--come un numero valido. Chiaramente no.
Flynn1179,

133

Ho usato questa funzione più volte:

public static bool IsNumeric(object Expression)
{
    double retNum;

    bool isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
    return isNum;
}

Ma puoi anche usare;

bool b1 = Microsoft.VisualBasic.Information.IsNumeric("1"); //true
bool b2 = Microsoft.VisualBasic.Information.IsNumeric("1aa"); // false

Dal benchmarking delle opzioni IsNumeric

testo alternativo
(fonte: aspalliance.com )

testo alternativo
(fonte: aspalliance.com )


80
riferendosi a Microsoft.VisualBasic.dll dall'app C #? eww: P
Lucas,

Non ho problemi a usare "IsNumeric", funziona bene. Inoltre puoi vedere che c'è poca differenza di efficienza tra TryParse e IsNumeric. Ricorda che TryParse è nuovo in 2.0 e prima di allora era meglio usare IsNumeric che qualsiasi altra strategia.
Nelson Miranda,

10
Bene, IsNumeric () di VB.NET usa internamente double.TryParse (), dopo un certo numero di giravolte necessarie (tra le altre cose) per la compatibilità con VB6. Se non hai bisogno di compatibilità, double. TryParse () è altrettanto semplice da usare e ti salva dallo spreco di memoria caricando Microsoft.VisualBasic.dll nel tuo processo.
Euro Micelli,

4
Nota rapida: l'uso di un'espressione regolare sarà molto più veloce se riuscirai a costruire la macchina a stati finiti sottostante una volta per tutte. Generalmente, la costruzione della macchina a stati richiede O (2 ^ n) dove n è la lunghezza della regex, mentre la lettura è O (k) dove k è la lunghezza della stringa da cercare. Quindi ricostruire la regex ogni volta introduce un pregiudizio.
Clément,

2
@Lucas In realtà, ci sono alcune cose davvero belle lì dentro, come un parser CSV completo. Nessun motivo per non usarlo se esiste lì.
Nyerguds,

32

Questa è probabilmente l'opzione migliore in C #.

Se vuoi sapere se la stringa contiene un numero intero (intero):

string someString;
// ...
int myInt;
bool isNumerical = int.TryParse(someString, out myInt);

Il metodo TryParse proverà a convertire la stringa in un numero (intero) e, se riesce, restituirà true e inserirà il numero corrispondente in myInt. In caso contrario, restituisce false.

Le soluzioni che utilizzano l' int.Parse(someString)alternativa mostrata in altre risposte funzionano, ma è molto più lenta perché generare eccezioni è molto costoso. TryParse(...)è stato aggiunto al linguaggio C # nella versione 2 e fino ad allora non avevi scelta. Ora lo fai: dovresti quindi evitare l' Parse()alternativa.

Se si desidera accettare numeri decimali, anche la classe decimale ha un .TryParse(...)metodo. Sostituisci int con decimale nella discussione precedente e si applicano gli stessi principi.


Perché TryParse è meglio del confronto di tutti i caratteri con caratteri interi?
Jimjim,

25

Puoi sempre utilizzare i metodi TryParse integrati per molti tipi di dati per vedere se la stringa in questione passerà.

Esempio.

decimal myDec;
var Result = decimal.TryParse("123", out myDec);

Il risultato sarebbe quindi = Vero

decimal myDec;
var Result = decimal.TryParse("abc", out myDec);

Il risultato sarebbe quindi = Falso


Penso di averlo fatto più nella sintassi in stile VB che in C #, ma si applicano le stesse regole.
TheXI

22

Nel caso in cui non si desideri utilizzare int.Parse o double.Parse, è possibile eseguire il rollback con qualcosa del genere:

public static class Extensions
{
    public static bool IsNumeric(this string s)
    {
        foreach (char c in s)
        {
            if (!char.IsDigit(c) && c != '.')
            {
                return false;
            }
        }

        return true;
    }
}

7
E se intendessero solo numeri interi? Che dire dei locali in cui "." è il separatore di gruppo, non la virgola (ad esempio pt-Br)? che dire dei numeri negativi? separatori di gruppo (virgole in inglese)? simboli di valuta? TryParse () può gestire tutti questi come richiesto usando NumberStyles e IFormatProvider.
Lucas,

Ooh sì, mi piace di più la versione All. Non ho mai usato quel metodo di estensione, buona chiamata. Anche se dovrebbe essere s.ToCharArray (). All (..). Per quanto riguarda il tuo secondo punto, ti ascolto, motivo per cui ti ho preceduto se non vuoi usare int.Parse .... (che presumo abbia più spese generali ...)
BFree

11
1.3.3.8.5 in realtà non è un numero, mentre 1.23E5 lo è.
Clément,

4
la logica è difettosa. -1
Russel Yang,

1
@Lucas Sono d'accordo che TryParse gestisce di più, ma a volte non è necessario. Devo solo convalidare le caselle del numero della mia carta di credito (che può contenere solo cifre). Questa soluzione è quasi sicuramente più veloce di provare ad analizzare.
Millie Smith,

14

Se vuoi catturare uno spettro più ampio di numeri, come is_numeric di PHP , puoi usare quanto segue:

// 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.
static readonly Regex _isNumericRegex =
    new Regex(  "^(" +
                /*Hex*/ @"0x[0-9a-f]+"  + "|" +
                /*Bin*/ @"0b[01]+"      + "|" + 
                /*Oct*/ @"0[0-7]*"      + "|" +
                /*Dec*/ @"((?!0)|[-+]|(?=0+\.))(\d*\.)?\d+(e\d+)?" + 
                ")$" );
static bool IsNumeric( string value )
{
    return _isNumericRegex.IsMatch( value );
}

Test unitario:

static void IsNumericTest()
{
    string[] l_unitTests = new string[] { 
        "123",      /* TRUE */
        "abc",      /* FALSE */
        "12.3",     /* TRUE */
        "+12.3",    /* TRUE */
        "-12.3",    /* TRUE */
        "1.23e2",   /* TRUE */
        "-1e23",    /* TRUE */
        "1.2ef",    /* FALSE */
        "0x0",      /* TRUE */
        "0xfff",    /* TRUE */
        "0xf1f",    /* TRUE */
        "0xf1g",    /* FALSE */
        "0123",     /* TRUE */
        "0999",     /* FALSE (not octal) */
        "+0999",    /* TRUE (forced decimal) */
        "0b0101",   /* TRUE */
        "0b0102"    /* FALSE */
    };

    foreach ( string l_unitTest in l_unitTests )
        Console.WriteLine( l_unitTest + " => " + IsNumeric( l_unitTest ).ToString() );

    Console.ReadKey( true );
}

Tieni presente che solo perché un valore è numerico non significa che può essere convertito in un tipo numerico. Ad esempio, "999999999999999999999999999999.9999999999"è un valore numerico valido perfettamente, ma non si adatta a un tipo numerico .NET (non uno definito nella libreria standard, cioè).


Non sto cercando di essere un alec intelligente qui, ma questo sembra non riuscire per la stringa "0". Il mio Regex è inesistente. C'è una semplice modifica per questo? Ottengo "0" e possibilmente "0.0" e anche "-0.0" come possibili numeri validi.
Steve Hibbert,

@SteveHibbert - Tutti sanno che "0" non è un numero! Scherzi a parte ... aggiustò la regex in modo che corrispondesse a 0.
JDB ricorda ancora Monica

Hmmm, sono io o "0" non è ancora riconosciuto come numerico?
Steve Hibbert,

1
Essendo pigro e regex-ignorante, ho tagliato il codice sopra, che sembra includere il cambio di tipo "0.0". Ho eseguito un test per verificare che una stringa "0" esegua .IsNumeric () e che restituisca false. Sto pensando che il test ottale tornerà vero per tutto ciò che ha due caratteri numerici in cui il primo è zero (e il secondo è zero a sette), ma restituirà falso solo per un grosso zero solitario da solo. Se si verifica "0", con il codice sopra, si ottiene falso? Chiedo scusa, se conoscessi più regex sarei in grado di dare un feedback migliore. Deve leggere.
Steve Hibbert,

1
! Doh! Ho appena riletto il tuo commento sopra, mi ero perso l'asterisco aggiuntivo, ho aggiornato solo la linea decimale. Con quello sul posto, hai ragione, "0" IsNumeric. Ci scusiamo per l'affannamento e grazie mille per l'aggiornamento, spero che aiuti anche gli altri. Molto obbligato.
Steve Hibbert,

14

So che questo è un vecchio thread, ma nessuna delle risposte lo ha fatto davvero per me - inefficiente o non incapsulato per un facile riutilizzo. Volevo anche assicurarmi che restituisse false se la stringa era vuota o nulla. TryParse restituisce true in questo caso (una stringa vuota non causa un errore durante l'analisi come numero). Quindi, ecco il mio metodo di estensione stringa:

public static class Extensions
{
    /// <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>
    public static bool IsNumeric(this string str, NumberStyles style = NumberStyles.Number,
        CultureInfo culture = null)
    {
        double num;
        if (culture == null) culture = CultureInfo.InvariantCulture;
        return Double.TryParse(str, style, culture, out num) && !String.IsNullOrWhiteSpace(str);
    }
}

Semplice da usare:

var mystring = "1234.56789";
var test = mystring.IsNumeric();

Oppure, se si desidera testare altri tipi di numeri, è possibile specificare lo "stile". Quindi, per convertire un numero con un esponente, è possibile utilizzare:

var mystring = "5.2453232E6";
var test = mystring.IsNumeric(style: NumberStyles.AllowExponent);

O per testare una potenziale stringa esadecimale, è possibile utilizzare:

var mystring = "0xF67AB2";
var test = mystring.IsNumeric(style: NumberStyles.HexNumber)

Il parametro facoltativo "cultura" può essere usato più o meno allo stesso modo.

È limitato dal fatto di non essere in grado di convertire stringhe troppo grandi per essere contenute in un doppio, ma questo è un requisito limitato e penso che se lavori con numeri più grandi di questo, probabilmente avrai bisogno di un'ulteriore gestione dei numeri specializzata funziona comunque.


2
Funziona alla grande, tranne che Double. TryParse non supporta NumberStyles.HexNumber. Vedi MSDN Double. TryParse. Qualche motivo per cui provi TryParse prima di controllare IsNullOrWhiteSpace? TryParse restituisce false se IsNullOrWhiteSpace no?
Harald Coppoolse,

10

È possibile utilizzare TryParse per determinare se la stringa può essere analizzata in un numero intero.

int i;
bool bNum = int.TryParse(str, out i);

Il booleano ti dirà se ha funzionato o meno.


9

Se vuoi verificare se una stringa è un numero (suppongo sia una stringa poiché se è un numero, duh, sai che è uno).

  • Senza regex e
  • usando il codice di Microsoft il più possibile

potresti anche fare:

public static bool IsNumber(this string aNumber)
{
     BigInteger temp_big_int;
     var is_number = BigInteger.TryParse(aNumber, out temp_big_int);
     return is_number;
}

Questo si prenderà cura dei soliti Nasty:

  • Meno (-) o Più (+) all'inizio
  • contiene il carattere decimaleBigIntegers non analizzerà i numeri con punti decimali. (Quindi: BigInteger.Parse("3.3")genererà un'eccezione, e TryParseper lo stesso restituirà false)
  • nessuna non cifra divertente
  • copre i casi in cui il numero è maggiore del normale utilizzo di Double.TryParse

Dovrai aggiungere un riferimento System.Numericse avere using System.Numerics;in cima alla tua classe (beh, il secondo è un bonus immagino :)


8

Immagino che questa risposta andrà persa tra tutti gli altri, ma comunque, ecco qui.

Ho finito con questa domanda via Google perché volevo verificare se stringera numericcosì che potevo semplicemente usare al double.Parse("123")posto diTryParse() metodo.

Perché? Perché è fastidioso dover dichiarare una outvariabile e controllare il risultato TryParse()prima di sapere se l'analisi non è riuscita o meno. Voglio usare il ternary operatorper verificare se lo stringènumerical e quindi analizzarlo nella prima espressione ternaria o fornire un valore predefinito nella seconda espressione ternaria.

Come questo:

var doubleValue = IsNumeric(numberAsString) ? double.Parse(numberAsString) : 0;

È solo molto più pulito di:

var doubleValue = 0;
if (double.TryParse(numberAsString, out doubleValue)) {
    //whatever you want to do with doubleValue
}

Ne ho fatti un paio extension methodsper questi casi:


Metodo di estensione uno

public static bool IsParseableAs<TInput>(this string value) {
    var type = typeof(TInput);

    var tryParseMethod = type.GetMethod("TryParse", BindingFlags.Static | BindingFlags.Public, Type.DefaultBinder,
        new[] { typeof(string), type.MakeByRefType() }, null);
    if (tryParseMethod == null) return false;

    var arguments = new[] { value, Activator.CreateInstance(type) };
    return (bool) tryParseMethod.Invoke(null, arguments);
}

Esempio:

"123".IsParseableAs<double>() ? double.Parse(sNumber) : 0;

Perché IsParseableAs()cerca di analizzare la stringa come il tipo appropriato invece di controllare solo se la stringa è "numerica", dovrebbe essere abbastanza sicura. E puoi anche usarlo per tipi non numerici che hanno un TryParse()metodo, comeDateTime .

Il metodo usa la riflessione e finisci per chiamare il TryParse()metodo due volte che, ovviamente, non è così efficiente, ma non tutto deve essere completamente ottimizzato, a volte la convenienza è solo più importante.

Questo metodo può anche essere utilizzato per analizzare facilmente un elenco di stringhe numeriche in un elenco doubleo in qualche altro tipo con un valore predefinito senza dover rilevare alcuna eccezione:

var sNumbers = new[] {"10", "20", "30"};
var dValues = sNumbers.Select(s => s.IsParseableAs<double>() ? double.Parse(s) : 0);

Metodo di estensione due

public static TOutput ParseAs<TOutput>(this string value, TOutput defaultValue) {
    var type = typeof(TOutput);

    var tryParseMethod = type.GetMethod("TryParse", BindingFlags.Static | BindingFlags.Public, Type.DefaultBinder,
        new[] { typeof(string), type.MakeByRefType() }, null);
    if (tryParseMethod == null) return defaultValue;

    var arguments = new object[] { value, null };
    return ((bool) tryParseMethod.Invoke(null, arguments)) ? (TOutput) arguments[1] : defaultValue;
}

Questo metodo di estensione consente di analizzare a stringcome qualsiasi altro typeche abbia aTryParse() metodo e ti consente anche di specificare un valore predefinito da restituire se la conversione non riesce.

Questo è meglio che usare l'operatore ternario con il metodo di estensione sopra come fa la conversione solo una volta. Usa ancora la riflessione però ...

Esempi:

"123".ParseAs<int>(10);
"abc".ParseAs<int>(25);
"123,78".ParseAs<double>(10);
"abc".ParseAs<double>(107.4);
"2014-10-28".ParseAs<DateTime>(DateTime.MinValue);
"monday".ParseAs<DateTime>(DateTime.MinValue);

Uscite:

123
25
123,78
107,4
28.10.2014 00:00:00
01.01.0001 00:00:00

4
Credo che potresti aver inventato uno degli approcci più inefficienti che abbia mai visto. Non solo stai analizzando la stringa due volte (nel caso in cui sia analizzabile), ma stai anche chiamando più volte funzioni di reflection per farlo. E, alla fine, non puoi nemmeno salvare i tasti usando il metodo di estensione.
JDB ricorda ancora Monica

Grazie per aver semplicemente ripetuto quello che ho scritto io stesso nel penultimo paragrafo. Inoltre, se prendi in considerazione il mio ultimo esempio, sicuramente salvi le sequenze di tasti usando questo metodo di estensione. Questa risposta non pretende di essere una sorta di soluzione magica a qualsiasi problema, è semplicemente un esempio di codice. Usalo o non usarlo. Penso che sia conveniente se usato correttamente. E include esempi sia di metodi di estensione che di riflessione, forse qualcuno può imparare da esso.
Hein Andre Grønnestad,

5
Ci hai provato var x = double.TryParse("2.2", new double()) ? double.Parse("2.2") : 0.0;?
JDB ricorda ancora Monica il

2
Sì, e non funziona. Argument 2 must be passed with the 'out' keyworde se si specifica outcosì come newsi ottiene A ref or out argument must be an assignable variable.
Hein Andre Grønnestad,

1
Prestazioni TryParse è meglio di tutti quelli esposti qui. Risultati: TryParse 8 Regex 20 PHP IsNumeric 30 Riflessioni TryParse 31 Codice test dotnetfiddle.net/x8GjAF
prampe

7

Se vuoi sapere se una stringa è un numero, puoi sempre provare ad analizzarla:

var numberString = "123";
int number;

int.TryParse(numberString , out number);

Si noti che TryParserestituisce a bool, che è possibile utilizzare per verificare se l'analisi è riuscita.



4

AGGIORNAMENTO della risposta di Kunal Noel

stringTest.All(char.IsDigit);
// This returns true if all characters of the string are digits.

Ma, in questo caso, abbiamo che le stringhe vuote supereranno quel test, quindi puoi:

if (!string.IsNullOrEmpty(stringTest) && stringTest.All(char.IsDigit)){
   // Do your logic here
}

4

La migliore soluzione flessibile con la funzione integrata .net chiamata- char.IsDigit. Funziona con numeri lunghi illimitati. Restituirà vero solo se ogni carattere è un numero numerico. L'ho usato molte volte senza problemi e con una soluzione molto più semplice che abbia mai trovato. Ho fatto un metodo di esempio, pronto per l'uso. Inoltre ho aggiunto la convalida per input nulli e vuoti. Quindi il metodo ora è totalmente a prova di proiettile

public static bool IsNumeric(string strNumber)
    {
        if (string.IsNullOrEmpty(strNumber))
        {
            return false;
        }
        else
        {
            int numberOfChar = strNumber.Count();
            if (numberOfChar > 0)
            {
                bool r = strNumber.All(char.IsDigit);
                return r;
            }
            else
            {
                return false;
            }
        }
    }

2

Con c # 7 puoi incorporare la variabile out:

if(int.TryParse(str, out int v))
{
}

2

Utilizzare questi metodi di estensione per distinguere chiaramente tra un controllo se la stringa è numerica e se la stringa contiene solo 0-9 cifre

public static class ExtensionMethods
{
    /// <summary>
    /// Returns true if string could represent a valid number, including decimals and local culture symbols
    /// </summary>
    public static bool IsNumeric(this string s)
    {
        decimal d;
        return decimal.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>
    public static bool IsNumbersOnly(this string s)
    {
        if (s == null || s == string.Empty)
            return false;

        foreach (char c in s)
        {
            if (c < '0' || c > '9') // Avoid using .IsDigit or .IsNumeric as they will return true for other characters
                return false;
        }

        return true;
    }
}

2
public static bool IsNumeric(this string input)
{
    int n;
    if (!string.IsNullOrEmpty(input)) //.Replace('.',null).Replace(',',null)
    {
        foreach (var i in input)
        {
            if (!int.TryParse(i.ToString(), out n))
            {
                return false;
            }

        }
        return true;
    }
    return false;
}

1

Spero che sia di aiuto

string myString = "abc";
double num;
bool isNumber = double.TryParse(myString , out num);

if isNumber 
{
//string is number
}
else
{
//string is not a number
}

0

Inserisci un riferimento a Visual Basic nel tuo progetto e usa il suo metodo Information.IsNumeric come mostrato sotto ed essere in grado di catturare float e numeri interi a differenza della risposta sopra che cattura solo ints.

    // Using Microsoft.VisualBasic;

    var txt = "ABCDEFG";

    if (Information.IsNumeric(txt))
        Console.WriteLine ("Numeric");

IsNumeric("12.3"); // true
IsNumeric("1"); // true
IsNumeric("abc"); // false

Un potenziale problema con questo approccio è che IsNumericesegue un'analisi dei caratteri della stringa. Quindi un numero simile 9999999999999999999999999999999999999999999999999999999999.99999999999verrà registrato come True, anche se non è possibile rappresentare questo numero utilizzando un tipo numerico standard.
JDB ricorda ancora Monica

0

Prova le seguenti regole

new Regex(@"^\d{4}").IsMatch("6")    // false
new Regex(@"^\d{4}").IsMatch("68ab") // false
new Regex(@"^\d{4}").IsMatch("1111abcdefg") ```

0

Tutte le risposte sono utili. Ma durante la ricerca di una soluzione in cui il valore numerico è di 12 cifre o più (nel mio caso), quindi durante il debug, ho trovato utile la seguente soluzione:

double tempInt = 0;
bool result = double.TryParse("Your_12_Digit_Or_more_StringValue", out tempInt);

La variabile risultante ti darà vero o falso.



-7
//To my knowledge I did this in a simple way
static void Main(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());
    }
    else
        Console.WriteLine("One or two inputs r string \n so that concatenation of these text box is = " + (a + b));
    Console.ReadKey();
}

static int 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;
}

1
Quattro voti negativi, ma nessuno ha detto perché? Presumo sia perché TryParse / Parse sarebbe un'opzione migliore, ma non tutti quelli che verranno qui lo sapranno.
njplumridge,

2
Hai reso così complicato che anche il programmatore C avrebbe detto "Accidenti, ci deve essere un modo più semplice per scriverlo"
Ch3shire,

1. Non c'è motivo di leggere DUE numeri dalla console e di aggiungerli. La provenienza della stringa è comunque irrilevante, quindi non c'è motivo di leggere nulla dalla console.
Algoman

2. La variabile per f non è necessaria, è possibile restituire direttamente 0 o 1 - se si desidera un singolo ritorno, è possibile utilizzare l'operatore ternario per quello. int è anche il tipo di ritorno errato per find, dovrebbe essere bool e potresti restituire s == s1
Algoman

3. copi le cifre di s in s1 e poi confronti s con s1. Questo è molto più lento di quanto deve essere. Inoltre, perché continui il ciclo interno anche se c [0] == s [i] è successo? Ti aspetti che s [i] sia uguale anche alle altre cifre?
Algoman
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.