2009-08-13 79 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