2009-08-13 19 views
20

Ich habe eine binäre Zeichenfolge, die vom Benutzer eingegeben wird, die ich in eine ganze Zahl konvertieren muss.Binary String zu Integer

Zuerst naivly ich diese einfache Linie verwendet:

Convert.ToInt32("11011",2); 

Leider dies löst eine Ausnahme aus, wenn der Benutzer direkt die ganze Zahl eingibt.

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

Wie kann ich sicherstellen, dass die Zeichenfolge vom Benutzer eingegebene tatsächlich eine binäre Zeichenfolge ist?

  • Versuch..Catch .... aber das ist einfach zu hässlich.
  • etwas wie 'Int32.TryParse' vielleicht.

Dank

+1

Wie gibt der Benutzer die Zeichenfolge ein? Wenn es ein Formular ist, können Sie es nicht darauf beschränken, nur '0' und '1' zu akzeptieren? – outis

+3

Warum ist "versuchen" - "fangen" "hässlich"? – RaYell

+0

Sie haben wahrscheinlich Recht, es ist nicht so hässlich. Ich bin jetzt mit ihm gegangen, weil Hex-Werte plötzlich auch möglich sind. Also ein paar einfache Versuche - Fänge sind nur die einfachste und einfachste Lösung. Danke an alle. – eric

Antwort

24

könnten Sie ein Regex verwenden, um sicherzustellen, dass er "^ [01] + $" (oder besser "^ [01] {1,32} $") ist, und dann Verwendung Convert?

natürlich sind Ausnahmen unwahrscheinlich zu einem großen Problem sowieso! Unelegant? könnte sein. Aber sie arbeiten.

Beispiel (für vertikalen Raum Formatierte):

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

Dies verarbeitet die Konvertierung von Convert.ToString ((long) Int32.MaxValue + 1, 2) nicht korrekt. Dies sollte zurückgewiesen werden, wird aber fälschlicherweise in Int32.MinValue konvertiert. –

+0

Warum sollte das abgelehnt werden? Es ist ein gültiger 32-Bit-Binärwert. Wenn Sie es als int32 interpretieren dann sicher: alles mit dem msb-Satz wird negativ sein ... und? –

+0

Danke tolle Lösung. Ich ging tatsächlich damit. Aber die Anforderungen haben sich verändert was ich so entschieden habe - catch ist die einfachste und sauberste Lösung – eric

2

Dank für die große und unglaublich schnelle Antwort!

Leider haben sich meine Anforderungen geändert. Jetzt kann der Benutzer ziemlich jedes Format eingeben. Binär, Dezimal, Hex. Also entschied ich mich zu versuchen - fangen bietet nur die einfachste und sauberste Lösung.

So nur für ein gutes Maß, ich poste den Code, den ich jetzt verwende. Ich denke, es ist ziemlich klar und sogar etwas elegant, oder so denke ich ^^.

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

Also vielen Dank für mich ermutigend Versuch zu verwenden - fangen, ich denke, es ist wirklich die bessere Lesbarkeit meines Codes verbessert.

Danke

+0

Was magst du nicht oktal? Aber ernsthaft, was ist, wenn jemand "11" eingibt und es in Basis 10 meint? Die Standardlösung wäre die Verwendung eines Präfixes ('0b', '', '0x'), das jedoch nicht Ihren Anforderungen entspricht. – outis

+0

Ja, kein Oktal ^^. Der Benutzer muss tatsächlich in Combobox auswählen, welches Format er verwenden möchte.Ich habe auch über Ihre Lösung nachgedacht, aber es schien einfacher mit einer Combobox. Danke, so viel Input. – eric