Bir dizenin sayı olup olmadığını belirleme


731

Bu dizeleri varsa:

  1. "abc" = false

  2. "123" = true

  3. "ab2" = false

IsNumeric()Bir dizenin geçerli bir sayı olup olmadığını belirleyebilen bir komut veya benzeri bir şey var mı?


79
örneklerinden tüm dizenin bir sayıyı temsil edip etmediğini kastediyorsunuz .
Lucas

47
dönüş str.All (Char.IsDigit);
Mohsen

13
str.All (Char.IsDigit) "3.14" yanlış yanı sıra "-2" ve "3E14" bildirecektir. Konuşmak için değil: "0x10"
Harald Coppoolse

4
Hangi tür sayıyı kontrol etmeye çalıştığınıza bağlıdır. Ayırıcı içermeyen tam sayılarda (yani ondalık basamak dizeleri) bu kontrol çalışır ve kabul edilen cevapla ve OP'de ima edilenle aynıdır.
Alex Mazzariol

1
@Lucas yorumunuz için teşekkür ederim, ne kadar uzun zamandır bir dize çift olarak bir int olarak ayrıştırmaya çalışıyorum ve neden başarısız olduğunu merak ediyorum hiçbir fikrim yok ...
Novastorm

Yanıtlar:


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

C # 7'den itibaren güncelleme :

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

veya numaraya ihtiyacınız yoksa out parametresini atabilirsiniz

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

Var ler kendi türlerine göre değiştirilebilir!


126
Yine de, double.TryParse kullanırım, çünkü bir sayıyı temsil edip etmediğini bilmek istiyoruz.
John Gietzen

5
Dizeyi "-123" veya "+123" olarak geçirirsem işlev true değerini döndürür. I Tamsayının pozitif ve negatif değerleri olduğunu anlıyorum. Ancak bu dize kullanıcının girdiği metin kutusundan geliyorsa, false döndürmelidir.
user2323308

9
Bir kullanıcı -2.147.483.648 ile 2.147.483.647'nin ötesinde bir değer girene kadar bu iyi bir çözümdür ve daha sonra bu sessizce başarısız olur
BlackTigerX

0,60 ayrıştırmayı deneyin (virgül!) geçersiz bir sayıdır ancak 60 olarak ayrıştırılacaktır!
Paul Zahra

2
Bu kontrol için uzatma yöntemine sahip olmayı tercih ediyorum: public static bool IsNumeric(this string text) { double _out; return double.TryParse(text, out _out); }
Hamid Naeemi

350

Bu input, tüm sayılarsa true değerini döndürür . Bundan daha iyi olup olmadığını bilmiyorum TryParse, ama işe yarayacak.

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

Karakterlerle karıştırılmış bir veya daha fazla sayı olup olmadığını bilmek istiyorsanız, ^ +ve işaretlerini bırakın $.

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

Düzenleme: Aslında çok uzun bir dize potansiyel olarak TryParse taşabilir çünkü TryParse daha iyi olduğunu düşünüyorum.


2
Gerçi regex'i bir kez ve herkes için inşa etmek çok daha verimli olurdu.
Clément

2
@CFP +1 ... RegEx, uygulanabilir olduğunda her zaman normal işlevlerden daha iyidir!
MAXE

19
@MAXE: Kabul etmem. Düzenli ifade kontrolleri oldukça yavaştır, bu nedenle performans düşünüldüğünde genellikle daha iyi çözümler vardır.
Michal B.

7
düzenleme: RegexOptions.Compiledolası bir hız artışı için bunlardan binlerce çalıştırıyorsanız parametre olarak ekleyebilirsinizRegex.IsMatch(x.BinNumber, @"^\d+$", RegexOptions.Compiled)
Simon_Weaver

9
ile negatifler ve şeyler üzerinde başarısız olacak.
Noctis

199

Ayrıca kullanabilirsiniz:

stringTest.All(char.IsDigit);

trueTüm Sayısal Rakamlar (değil float) ve falsegiriş dizesi herhangi bir alfasayısal ise geri döner .

Lütfen dikkat : stringTestboş bir dize olmamalıdır, çünkü bu sayısal olma testini geçecektir.


20
Çok güzel. Dikkat edilmesi gereken bir şey var: boş bir dize bu testi sayısal olarak geçirecektir.
dan-gph

2
@ dan-gph: Sevindim, hoşuna gitti. Evet haklısın. Yukarıdaki notu güncelledim. Teşekkürler!
Kunal Goel

1
bu ondalık durumlar için de çalışmaz. Doğru test stringTest.All (l => char.IsDigit (l) || '.' == l || '-' == l);
Salman Hasrat Khan

Salman girişiniz için teşekkürler, Bir dizeden ondalık sayıları özellikle kontrol etmek için - if (Decimal.TryParse (stringTest2, çıkış değeri)) {/ * Evet, Ondalık /} else {/ Hayır, Ondalık Değil * / }
Kunal Goel

6
Salman, o kadar basit değil - bu ..--..--geçerli bir sayı olarak geçecekti . Açıkçası değil.
Flynn1179

133

Bu işlevi birkaç kez kullandım:

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

Ancak kullanabilirsiniz;

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

Gönderen Kıyaslama vererek isNumeric öğesinin Seçenekler

alternatif metin
(kaynak: aspalliance.com )

alternatif metin
(kaynak: aspalliance.com )


80
C # app Microsoft.VisualBasic.dll başvurma? eww: P
Lucas

"IsNumeric" kullanmak için hiçbir sorunum yok iyi çalışıyor. Ayrıca TryParse ve IsNumeric arasında çok az verimlilik farkı olduğunu görebilirsiniz. TryParse'ın 2.0'da yeni olduğunu ve daha önce IsNumeric'i kullanmak için başka bir stratejinin daha iyi olduğunu unutmayın.
Nelson Miranda

10
VB.NET'in IsNumeric () öğesi, VB6 uyumluluğu için gerekli olan (diğer şeylerin yanı sıra) bir dizi dönme işleminden sonra dahili olarak double.TryParse () öğesini kullanır. Uyumluluğa ihtiyacınız yoksa, double.TryParse () kullanımı basittir ve işleminize Microsoft.VisualBasic.dll dosyasını yükleyerek belleği boşa harcamamanızı sağlar.
Euro Micelli

4
Kısa not: Temel sonlu durum makinesini bir kez ve herkes için inşa etmeyi başarırsanız, normal bir ifade kullanmak çok daha hızlı olacaktır. Genel olarak, durum makinesinin oluşturulması O (2 ^ n) alır, burada n normal ifadenin uzunluğudur, okuma ise O (k) olur; burada k, aranan dizenin uzunluğudur. Yani her seferinde normal ifadenin yeniden oluşturulması bir önyargı ortaya çıkarır.
Clément

2
@Lucas Aslında, orada tam bir csv ayrıştırıcısı gibi gerçekten güzel şeyler var. Orada varsa kullanmamaya gerek yok.
Nyerguds

32

Bu muhtemelen C # en iyi seçenektir.

Dizenin bir tam sayı (tamsayı) içerip içermediğini bilmek istiyorsanız:

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

TryParse yöntemi, dizeyi bir sayıya (tamsayı) dönüştürmeyi dener ve başarılı olursa true değerini döndürür ve karşılık gelen sayıyı myInt öğesine yerleştirir. Eğer yapamazsa, yanlış döndürür.

int.Parse(someString)Diğer yanıtlarda gösterilen alternatifi kullanan çözümler işe yarar, ancak çok daha yavaştır, çünkü istisnaları atmak çok pahalıdır. TryParse(...)sürüm 2'de C # diline eklendi ve o zamana kadar seçeneğiniz yoktu. Şimdi yapıyorsunuz: bu nedenle Parse()alternatiften kaçınmalısınız .

Ondalık sayıları kabul etmek istiyorsanız, ondalık sınıfın da bir .TryParse(...)yöntemi vardır. Yukarıdaki tartışmada int'i ondalık ile değiştirin ve aynı ilkeler geçerlidir.


TryParse neden tüm karakterleri tamsayı karakterlerle karşılaştırmaktan daha iyi?
Arjang

25

Söz konusu dizenin geçip geçmeyeceğini görmek için birçok veri türü için yerleşik TryParse yöntemlerini her zaman kullanabilirsiniz.

Misal.

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

Sonuç = Doğru olur

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

Sonuç = yanlış


Ben VB tarzı sözdizimi C # daha yapmış olabilir düşünüyorum, ama aynı kurallar geçerlidir.
TheTXI

22

İnt.Parse veya double.Parse'ı kullanmak istemiyorsanız, kendinize böyle bir şeyle yuvarlayabilirsiniz:

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
Ya sadece tamsayılar demek istiyorlarsa? Peki ya '.' ayırıcı değil, virgül değil mi? negatif sayılar ne olacak? grup ayırıcılar (virgül İngilizce)? para birimi simgeleri? TryParse (), NumberStyles ve IFormatProvider kullanarak bunları gerektiği gibi yönetebilir.
Lucas

Ooh evet, All versiyonunu daha çok seviyorum. Aslında bu uzatma yöntemini hiç kullanmadım, iyi çağrı. Rağmen s.ToCharArray (). Tüm (..). İkinci nokta gelince, ben .... sana int.Parse kullanmak istemiyorsanız ile başında olduğu neden ya duymak (I varsayarak hangi ... daha havai vardır)
BFree

11
1.3.3.8.5 gerçekte bir sayı değil, 1.23E5 ise.
Clément

4
mantık kusurludur. -1
Russel Yang

1
@Lucas TryParse'ın daha fazlasını ele aldığını kabul ediyorum, ancak bazen buna gerek yok. Sadece kredi kartı numara kutuları (sadece rakam olabilir) doğrulamak gerekir. Bu çözüm, ayrıştırmayı denemekten neredeyse kesinlikle daha hızlıdır.
Millie Smith

14

Daha geniş bir sayı yelpazesini (à la PHP'nin is_numeric) yakalamak istiyorsanız , aşağıdakileri kullanabilirsiniz:

// 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 );
}

Ünite testi:

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 );
}

Bir değerin sayısal olması, bunun sayısal bir türe dönüştürülebileceği anlamına gelmediğini unutmayın. Örneğin, "999999999999999999999999999999.9999999999"geçerli bir sayısal değerdir, ancak .NET sayısal türüne sığmaz (standart kitaplıkta tanımlanan bir değer değildir).


Burada akıllı bir alec olmaya çalışmıyorum ama bu "0" dizesi için başarısız gibi görünüyor. Regex'im mevcut değil. Bunun için basit bir değişiklik var mı? Mümkün olduğunca geçerli "0" ve "0.0" ve hatta "-0.0" olsun.
Steve Hibbert

@SteveHibbert - Herkes "0" ın bir sayı olmadığını biliyor! Ciddi olsa da ... normal
ifadeyi

Hmmm, bu ben miyim, yoksa "0" hala sayısal olarak tanınmıyor mu?
Steve Hibbert

1
Tembel ve regex-cahil olmak, yukarıdaki kodu kesilmiş ve yapıştırılmış, "0.0" türü değişikliği gibi görünüyor. "0" çalıştıran bir dizenin .IsNumeric () çalışıp çalışmadığını kontrol etmek için bir test çalıştırdım. Sekizlik testin birincisi sıfır olan (ve ikincisi sıfırdan yediye) iki sayısal karakter içeren her şey için doğru döneceğini, ancak tek başına büyük bir yağ yalnız sıfır için yanlış döndüreceğini düşünüyorum. "0" kodunu yukarıdaki kodla test ederseniz yanlış olur mu? Özür dilerim, daha fazla regex bilseydim daha iyi geri bildirim verebilirdim. Okunmalı.
Steve Hibbert

1
! Doh! Sadece yukarıdaki yorumunuzu tekrar okuyun, ek yıldız işaretini kaçırmıştım, sadece ondalık satırı güncelledim. Bu durumda, haklısınız, "0" IsNumeric. Faffing için özür dileriz ve güncelleme için çok teşekkürler, umarım başkalarına da yardımcı olur. Çok minnettarım.
Steve Hibbert

14

Bu eski bir iplik olduğunu biliyorum, ama cevapların hiçbiri gerçekten benim için yaptım - ya verimsiz, ya da kolay yeniden kullanım için kapsüllenmiş değil. Ben de dize boş veya boş olsaydı yanlış döndüğünden emin olmak istedim. TryParse bu durumda true değerini döndürür (boş bir dize, sayı olarak ayrıştırılırken hataya neden olmaz). İşte, benim dize uzantısı yöntemi:

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);
    }
}

Kullanımı kolay:

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

Veya, diğer sayı türlerini test etmek istiyorsanız, 'stili' belirleyebilirsiniz. Bir sayıyı Üs ile dönüştürmek için şunları kullanabilirsiniz:

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

Veya olası bir Hex dizesini test etmek için şunları kullanabilirsiniz:

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

İsteğe bağlı 'kültür' parametresi de aynı şekilde kullanılabilir.

Bir çiftte yer almak için çok büyük olan dizeleri dönüştürememekle sınırlıdır, ancak bu sınırlı bir gereksinimdir ve bence bundan daha büyük sayılarla çalışıyorsanız, muhtemelen ek özel numara işlemeye ihtiyacınız olacak zaten çalışır.


2
Double.TryParse, NumberStyles.HexNumber'ı desteklememesi dışında harika çalışır. Bkz. MSDN Double.TryParse. Herhangi bir neden IsNullOrWhiteSpace için kontrol etmeden önce TryParse? TryParse, IsNullOrWhiteSpace değilse yanlış döndürür?
Harald Coppoolse

10

Dizenin bir tamsayıya ayrıştırılıp ayrıştırılamayacağını belirlemek için TryParse kullanabilirsiniz.

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

Boole size işe yarayıp yaramadığını söyleyecektir.


9

Eğer bir dize bir sayı olup olmadığını kontrol etmek istiyorsanız (bir sayı olduğu için bir dize olduğunu varsayıyorum, duh, bir olduğunu biliyorsunuz).

  • Normal ifade olmadan ve
  • Microsoft'un kodunu mümkün olduğunca kullanmak

ayrıca şunları da yapabilirsiniz:

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

Bu olağan nasties ile ilgilenecektir:

  • Başlangıçta eksi (-) veya Artı (+)
  • ondalık karakter içeriyorBigIntegers ondalık noktalı sayıları ayrıştırmaz. (Yani: BigInteger.Parse("3.3")bir istisna atacak ve TryParseaynı için yanlış dönecektir)
  • komik rakamlar yok
  • sayının normal kullanımından daha büyük olduğu durumları kapsar Double.TryParse

Sınıfınıza bir referans eklemeniz System.Numericsve using System.Numerics;sınıfınızın üstünde olmanız gerekir (ikincisi sanırım bir bonus :)


8

Sanırım bu cevap diğer tüm cevaplar arasında kaybolacak, ama her neyse, işte gidiyor.

Ben kontrol etmek istedim çünkü Google üzerinden bu soruya sona erdi stringoldu numericSadece kullanabilir böylece double.Parse("123")yerine TryParse()yöntemle.

Neden? Bir outdeğişken bildirmek TryParse()ve ayrıştırmanın başarısız olup olmadığını bilmeden önce sonucunu kontrol etmek can sıkıcıdır . Kullanmak istediğim ternary operatorolmadığını kontrol etmek stringolduğunu numericalve sonra sadece ilk üçlü ifadede ayrıştırmak veya ikinci üçlü ifadesinde varsayılan bir değer sağlar.

Bunun gibi:

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

Şundan çok daha temiz:

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

extension methodsBu davalar için bir çift yaptım :


Birinci uzantı yöntemi

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);
}

Misal:

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

Çünkü IsParseableAs()çalışır sadece dize ise kontrol yerine uygun türü olarak dize ayrıştırmak için "sayısal" oldukça güvenli olmalıdır. Hatta bir TryParse()yöntemi olan sayısal olmayan türler için bile kullanabilirsiniz DateTime.

Yöntem yansıma kullanır ve TryParse()yöntemi iki kez çağırırsınız, ki bu elbette etkili değildir, ancak her şey tam olarak optimize edilmemelidir, bazen kolaylık daha da önemlidir.

Bu yöntem, sayısal dizelerin bir listesini doubleherhangi bir istisna yakalamak zorunda kalmadan varsayılan değere sahip bir listeye veya başka bir türe kolayca ayrıştırmak için de kullanılabilir :

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

Genişletme yöntemi iki

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

Bu uzantı yöntemi , bir yöntemi olan stringherhangi typebir TryParse()yöntemi ayrıştırmanıza ve ayrıca dönüşüm başarısız olursa döndürülecek varsayılan bir değer belirtmenize olanak tanır.

Bu, üçlü operatörü yukarıdaki uzantı yöntemiyle kullanmaktan daha iyidir, çünkü dönüşümü yalnızca bir kez yapar. Yine de yansıma kullanıyor ...

Örnekler:

"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);

Çıktılar:

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

4
Henüz gördüğüm en verimsiz yaklaşımlardan birini icat etmiş olabilirsiniz. Dizeyi iki kez ayrıştırmakla kalmaz (ayrıştırılabilir olması durumunda), bunu yapmak için yansıma işlevlerini birden çok kez çağırırsınız . Ve sonunda, uzantı yöntemini kullanarak herhangi bir tuş vuruşunu bile kaydetmezsiniz.
JDB hala

İkinci paragraftan son paragrafa kadar kendimi yazdıklarımı tekrarladığınız için teşekkür ederim. Ayrıca son örneğimi dikkate alırsanız, bu uzantı yöntemini kullanarak tuş vuruşlarını kesinlikle kaydedersiniz. Bu cevap herhangi bir soruna sihirli bir çözüm olduğunu iddia etmiyor, sadece bir kod örneği. Kullan ya da kullanma. Doğru kullanıldığında uygun olduğunu düşünüyorum. Ve hem uzatma yöntemleri hem de yansıma örnekleri içerir, belki biri ondan öğrenebilir.
Hein Andre Grønnestad

5
Denedin var x = double.TryParse("2.2", new double()) ? double.Parse("2.2") : 0.0;mi
JDB hala Monica

2
Evet ve işe yaramıyor. Argument 2 must be passed with the 'out' keywordve belirtirseniz outyanı sıra newalmak A ref or out argument must be an assignable variable.
Hein Andre Grønnestad

1
Performans TryParse burada açıkta kalanlardan daha iyidir. Sonuçlar: TryParse 8 Regex 20 PHP IsNumeric 30 Yansımalar TryParse 31 Test kodu dotnetfiddle.net/x8GjAF
prampe

7

Bir dizenin sayı olup olmadığını bilmek istiyorsanız, onu her zaman ayrıştırmayı deneyebilirsiniz:

var numberString = "123";
int number;

int.TryParse(numberString , out number);

Ayrıştırma işleminizin başarılı olup olmadığını kontrol etmek için kullanabileceğiniz TryParsebir a döndürdüğünü unutmayın bool.



4

Kunal Noel GÜNCELLEME Cevap

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

Ancak, bu durumda, boş dizelerin bu testi geçeceğini var, böylece şunları yapabilirsiniz:

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

4

Denilen .net yerleşik işleviyle en iyi esnek çözüm char.IsDigit. Sınırsız uzun sayılarla çalışır. Yalnızca her karakter sayısal bir sayı olduğunda true değerini döndürür. Ben hiçbir sorun ve şimdiye kadar buldum çok daha kolay bir çözüm ile birçok kez kullandım. Örnek bir yöntem yaptım, kullanıma hazır. Ayrıca boş ve boş girdi için doğrulama ekledim. Bu yüzden yöntem artık tamamen kurşun geçirmez

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

C # 7 ile out değişkenini satır içi yapabilirsiniz:

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

2

Dizenin sayısal olup olmadığını ve dizenin yalnızca 0-9 basamak içerip içermediğini kontrol etmek için bu uzantı yöntemlerini kullanın

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

Bu yardımcı olur umarım

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

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

0

Projenizde Visual Basic'e bir başvuru çekin ve aşağıda gösterildiği gibi onun Information.IsNumeric yöntemini kullanın ve sadece ints yakalayan yukarıdaki yanıtın aksine şamandıraları ve tam sayıları yakalayabilir.

    // Using Microsoft.VisualBasic;

    var txt = "ABCDEFG";

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

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

Bu yaklaşımla ilgili potansiyel bir problem IsNumeric, dizenin karakter analizinin yapılmasıdır. Dolayısıyla , bu sayıyı standart bir sayısal tür kullanarak temsil etmenin bir yolu olmamasına rağmen, gibi bir sayı 9999999999999999999999999999999999999999999999999999999999.99999999999kaydedilecektir True.
JDB hala

0

Aşağıdaki tabloları deneyin

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

0

Tüm Cevaplar Yararlıdır. Ancak Sayısal değerin 12 basamak veya daha fazla olduğu bir çözüm ararken (benim durumumda), daha sonra hata ayıklama sırasında aşağıdaki çözümü yararlı buldum:

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

Sonuç değişkeni size doğru veya yanlış verir.



-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
Dört iniş yok, ama kimse nedenini söylemedi? Bence TryParse / Parse daha iyi bir seçenek olurdu, ama buraya gelen herkes bunu bilemez.
njplumridge

2
O kadar karmaşık hale
getirdiniz

1. Konsoldan İKİ sayı okumak ve eklemek için bir neden yoktur. Dizenin nereden geldiği önemli değil, bu yüzden konsoldan hiçbir şey okumak için hiçbir neden yok.
Algoman

2. f değişkeni gereksizdir, doğrudan 0 veya 1 döndürebilirsiniz - tek bir dönüş istiyorsanız, bunun için üçlü işleci kullanabilirsiniz. int de bulmak için yanlış dönüş türü, bool olmalı ve s == s1
Algoman

3. s basamaklarını s1'e kopyalarsınız ve s'yi s1 ile karşılaştırırsınız. Bu olması gerekenden çok daha yavaş. Ayrıca neden c [0] == s [i] olsa bile iç döngüye devam ediyorsunuz? S [i] 'nin diğer rakamlara da eşit olmasını mı bekliyorsunuz?
Algoman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.