C #: C # için php ctype_digit işlevine benzer bir şey?

6 Cevap

Ben bir dize var ve ben sadece rakamlardan ibaret olduğunu kontrol etmek istiyorum. Gerçekten ben sadece (sadece rakam, ya hiçbir kayan nokta ayırıcı) basamaklı bir şey ama içermediğini bilmek istiyorum, istediğiniz (ya da gerekir) o ya da bir şey ayrıştırmak yok.

PHP ctype_digit denilen bu güzel işlevi vardır. C # yerde. Net Framework için benzer bir şey var mı? Ya da böyle bir düzenli ifadeyi veya bir şey kullanmak gerekiyor?

Bunun için regex oluşturma elbette oldukça basit olurdu, ama ben daha iyi yollar var, bunu kullanmak değil istiyorum: p

6 Cevap

D: @ 'ın cevabı bruno conde Beni bu düşündürdü

if(subject.All(char.IsDigit))
    // Do something

Ben bunu daha önce düşünmedim inanamıyorum ...

Sen kullanabilirsiniz int.TryParse. Sağlanan dize aksi takdirde false, geçerli bir sayı temsil eğer true dönecektir. NumerStyles.None boşluk ve artı / eksi işaretini izin vermemek için kullanmak unutmayın.

UPDATE: empi diyor, bu çok büyük dizeleri için çalışmaz. Eğer keyfi büyük dizeleri varsa, belki bir regex tek seçenektir. Sen Regex.IsMatch(theString,"^[0-9]+$") gibi bir şey yapabileceğini

Galiba, sizin için işi yapmak için regex kullanmak daha iyi olurdu ... "\ d +" Tamam, bunu kullanmak istemiyorum dedi ... bunu ... ama sağlamanın kusursuz bir yoludur gerekir dize sıradanifade geçerse o zaman, sen int.Parse (...) derhal kullanabilirsiniz, sadece numaralarını içerir.

Evet, kullanabilirsiniz

bool Int32.TryParse(string s, out int result);

Kod örneği:

string myString = "1265";
int myInt;

if (Int32.TryParse(myString,myInt) // Returns true if mystring contains only digits
{
...
}

Diğer seçenek Regex kullanmaktır:

    public static bool IsDigit(string myString)
    {
        string pattern = @"^\d*$";

        if (Regex.IsMatch(myString, pattern))
            return true;
        else
            return false;
    }

Size şartının olarak desen değiştirebilirsiniz.

Hiçbir yerleşik bir yöntem yoktur. Int32.TryParse veya Int64.TryParse (onlar da tam sayıları temsil etmek için kullanılan diğer karakter izin verebilir) sadece sayıları içeren çok uzun dizeler için çalışmaz.

Diğer insanlar söylediler numaralı gerçekten son derece büyük olmadığı sürece, daha büyük bir dizi var, diğer türleri TryParse yöntemini kullanabilirsiniz rağmen, siz, int.TryParse yöntemini kullanabilirsiniz int32 en fazla. (Tabii ve noktalama işaretleri önlemek için, NumberStyles.None seçeneği kullanılarak) dönüştürülmüştür.

Burada kırılma aşağı bulunuyor:

  1. int -2,147,483,648 .. 2,147,483,647
  2. uint 0 .. 4,294,967,295
  3. long -9.223.372.036.854.775.808 .. 9.223.372.036.854.775.807
  4. ulong 0 .. 18.446.744.073.709.551.615
  5. float-3.402823E38 .. 3.402823E38
  6. double-1.79769313486232e308 .. 1.79769313486232e308
  7. decimal -79228162514264337593543950335 .. 79228162514264337593543950335

Büyük numaralarını ayrıştırmak biridir Double. Eğer numarasını kullanmak gerekiyorsa, bazı hassasiyet kaybedersiniz, ama (sen bir sorun olmamalı bu yüzden bunu kullanmaya gerek yok demek rağmen) gerçekten uzun numaralarını ayrıştırmak. Ben yaptım hızlı bir testte, başarıyla aşağıdaki dizeyi ayrıştırmak başardı:

79228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335234234234234243423

(308 karakter şu, bir daha sayı ile başarısız olur)

Eğer numarayı kullanmak için gidiş değildir Yine de, eğer, bu yüzden Regex için gitmek, hatta daha iyi, her karakteri bir rakam olduğunu kontrol döngü olur, bir overkill olabilir.

Eğer istedğim biraz deli giderseniz birkaç küçük dizeleri içine bölünmüş ve paralel bir şekilde kontrol etmek Görev kütüphane kullanabilirsiniz: P

(Ben şimdi biraz offtopic biliyorum, ama bunu yapmak istediğiniz takdirde, bu C9 10dk klibi check out, parallel.for ve Partition Ranger kontrol etmelisiniz: {[(2) ]})