Soru Tamsayıya İkili Dize


Bir tam sayıya dönüştürmem gereken kullanıcı tarafından girilen bir ikili dizgim var.

İlk başta bu basit çizgiyi tamamen kullandım:

Convert.ToInt32("11011",2);

Kullanıcı tamsayıya doğrudan girerse, maalesef bu bir istisna atar.

Convert.ToInt32("123",2); // throws Exception

Kullanıcı tarafından girilen dizgenin aslında bir ikili dizgeden olduğundan emin olabilir miyim?

  • try..catch .... ama bu sadece çok çirkin.
  • belki de Int32.TryParse gibi bir şey.

Teşekkürler


21
2017-08-13 12:05


Menşei


Kullanıcı dizgiyi nasıl girer? Eğer bir formsa, onu sadece '0' ve '1' kabul etmek için sınırlayamaz mıydınız? - outis
Neden ki try - catch "çirkin"? - RaYell
Muhtemelen haklısın, o kadar da çirkin değil. Aslında şimdi onunla birlikte gittim çünkü Hex değeri aniden mümkün olabiliyor. Yani bazı basit denemeler sadece en basit ve en kolay çözümdür. Herkese teşekkürler. - eric


Cevaplar:


Sen kullanabilirsin Regex "^ [01] + $" (veya daha iyisi, "^ [01] {1,32} $") olduğunu kontrol etmek sonra kullanım Convert?

elbette istisnalar olası olmayan zaten büyük bir sorun olmak için! Inelegant? olabilir. Ama çalışıyorlar.

Örnek (dikey alan için biçimlendirilmiş):

static readonly Regex binary = new Regex("^[01]{1,32}$", RegexOptions.Compiled);
static void Main() {
    Test("");
    Test("01101");
    Test("123");
    Test("0110101101010110101010101010001010100011010100101010");
}
static void Test(string s) {
    if (binary.IsMatch(s)) {
        Console.WriteLine(Convert.ToInt32(s, 2));
    } else {
        Console.WriteLine("invalid: " + s);
    }
}

26
2017-08-13 12:07



Bu, Convert.ToString ((uzun) Int32.MaxValue + 1, 2) dönüşümünü doğru şekilde işlemez. Bu reddedilmeli ancak yanlış Int32.MinValue'ye dönüştürülmelidir. - Ben Lings
Neden reddedilmeli? Geçerli bir 32 bit ikili değerdir. Eğer int32 olarak yorumlamayı seçerseniz, emin olun: msb setindeki herhangi bir şey negatif olacak ... ve? - Marc Gravell♦
Teşekkürler harika çözüm. Aslında onunla gittim. Ancak gereklilikler biraz değişti, denemeye karar verdim - yakalama en basit ve en temiz çözümdür - eric
Çok fazla Regex deneyimim yok, bu 1-32 karakter olduğunu ve bunların 0 veya 1 olması gerektiğini kontrol ediyor mu? Geçerli sekizli dizgileri için benzer bir kontrol yapmanın en iyi yolu nedir? .NET'in, yalnızca Ondalık ve Onaltılı yerine İkili ve Sekizli'yi kontrol ettiğiniz bir int.TryParse olmasını isterdim - R1PFake
@ R1PFake evet, ^...$ dizenin başlangıcını / sonunu test eder (yani: başka bir şey); [01] "0 veya 1" anlamına gelir ve {1,32} "1 ila 32 kez, dahil" anlamına gelir - Marc Gravell♦


Harika ve inanılmaz hızlı cevap için teşekkürler!

Talihsizce benim gereksinimleri değişti. Şimdi kullanıcı hemen hemen herhangi bir formatı girebilir. İkili, Ondalık, Onaltılı. Bu yüzden denemeye karar verdim - yakalamak sadece en basit ve en temiz çözümü sağlıyor.

Yani sadece iyi bir ölçü için şimdi kullanıyorum kodu gönderiyorum. Ben oldukça açık ve hatta biraz zarif olduğunu düşünüyorum, ya da ben ^ ^ düşünüyorum.

switch (format)
{
    case VariableFormat.Binary:
        try
        {
            result = Convert.ToInt64(value, 2)
        }
        catch
        {
            // error handling
        }
        break;
    case VariableFormat.Decimal:
        try
        {
            result = Convert.ToInt64(value, 10)
        }
        catch
        {
            // error handling
        }
        break;
    case VariableFormat.Hexadecimal:
        try
        {
            result = Convert.ToInt64(value, 16)
        }
        catch
        {
            // error handling
        }
        break;
}

Bu yüzden beni kullanmaya çalışmamı teşvik ettiğin için teşekkürler, kodumun okunabilirliğini gerçekten geliştirdiğini düşünüyorum.

Teşekkürler


3
2017-08-14 06:04



Ne, sekizliyi sevmiyor musun? Cidden olsa, ya birileri '11' girerse ve 10. temelde mi kastediyorsa? Standart çözüm, bir önek ('0b', '', '0x') kullanmak olacaktır, ancak bu gereksinimlerinize uymayabilir. - outis
Evet hiç octal ^^ Kullanıcı aslında kullanmak istediği formatı combobox'ta seçmek zorunda. Çözümünüzü de düşündüm ama bir açılan kutu ile daha kolay görünüyordu. Çok teşekkürler çok giriş. - eric