2009-08-13 118 views
20

我有一个二进制串,由用户,我需要转换为整数输入。二进制字符串到整数

起初我naivly使用这个简单的行:

Convert.ToInt32("11011",2); 

不幸的是,如果用户直接入射到整数这个抛出异常。

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

如何确保用户输入的字符串实际上是二进制字符串?

  • try..catch ....但这太难看了。
  • 像 'Int32.TryParse' 也许。

感谢

+1

用户如何输入字符串?如果它是一种形式,你能不能限制它只接受'0'和'1'? – outis 2009-08-13 12:19:18

+3

为什么'try' - 'catch'“丑”? – RaYell 2009-08-13 12:25:57

+0

你可能是对的,它并不那么难看。我现在实际上也是这样,因为十六进制值可能会突然出现。所以一些简单的尝试就是最简单和最简单的解决方案。谢谢大家。 – eric 2009-08-14 05:52:38

回答

24

你可以使用一个Regex来检查,这是 “^ [01] + $”(或更好, “^ [01] {1,32} $”),并然后使用Convert

当然

,例外是不可能是一个巨大的问题呢!不雅?也许。但他们工作。

例(格式化的垂直空间):

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

这并不正确处理Convert.ToString的转化率((长)Int32.MaxValue + 1,2)。这应该被拒绝,但被错误地转换为Int32.MinValue。 – 2009-08-13 12:32:54

+0

为什么要被拒绝?它是一个有效的32位二进制值。如果你选择将它解释为int32,那么肯定:任何带有msb集合的东西都将是负数......并且? – 2009-08-13 12:38:45

+0

感谢伟大的解决方案。我真的去了。但要求改变了一些,所以我决定尝试 - 抓住是最简单和最干净的解决方案 – eric 2009-08-14 05:54:01

2

感谢伟大的和令人难以置信的快速的答案!

Unfortunaetly我的要求改变。现在用户几乎可以输入任何格式。二进制,十进制,十六进制。所以我决定try-catch只是提供最简单和最干净的解决方案。

所以只是为了好措施我张贴我现在使用的代码。我认为这很清楚,甚至有点优雅,所以我认为^^。

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

所以感谢你鼓励我使用try - 赶上,我认为它确实提高了我的代码的可读性。

谢谢

+0

什么,你不喜欢八进制?但是,严肃地说,如果有人输入“11”并以10为底?标准解决方案是使用前缀('0b','','0x'),但这可能不符合您的要求。 – outis 2009-08-16 07:13:12

+0

没有八进制^^。用户实际上必须选择她想要使用的格式的组合框。我也考虑过您的解决方案,但使用组合框似乎更容易。感谢这么好的投入。 – eric 2009-08-17 05:26:10