2009-08-13 81 views
20

Tôi có chuỗi nhị phân, được nhập bởi người dùng, mà tôi cần chuyển đổi thành số nguyên.Chuỗi nhị phân thành số nguyên

Lúc đầu, tôi naivly sử dụng dòng đơn giản này:

Convert.ToInt32("11011",2); 

Thật không may này ném một ngoại lệ nếu người dùng nhập vào số nguyên trực tiếp.

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

Làm cách nào để đảm bảo chuỗi được người dùng nhập thực sự là chuỗi nhị phân?

  • try..catch .... nhưng điều đó quá xấu.
  • giống như 'Int32.TryParse' có thể.

Cảm ơn

+1

Người dùng nhập chuỗi như thế nào? Nếu đó là một hình thức, bạn không thể giới hạn nó chỉ chấp nhận '0' và '1'? – outis

+3

Tại sao 'try' -' catch' "ugly"? – RaYell

+0

Bạn có lẽ đúng, nó không phải là xấu xí. Tôi thực sự đã đi với nó bây giờ bởi vì giá trị Hex đột nhiên có thể là tốt. Vì vậy, một số try - catch đơn giản chỉ là giải pháp đơn giản và dễ dàng nhất. Cảm ơn tất cả mọi người. – eric

Trả lời

24

Bạn có thể sử dụng một Regex để kiểm tra xem nó là "^ [01] + $" (hoặc tốt hơn, "^ [01] {1,32} $"), và sau đó sử dụng Convert?

tất nhiên, ngoại lệ là không phải là một sự cố lớn! Inelegant? có lẽ. Nhưng chúng hoạt động.

Ví dụ (định dạng cho không gian dọc):

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

Điều này không chính xác xử lý chuyển đổi của Convert.ToString ((dài) Int32.MaxValue + 1, 2). Điều này sẽ bị từ chối nhưng không được chuyển đổi thành Int32.MinValue. –

+0

Tại sao điều đó bị từ chối? Nó là một giá trị nhị phân 32 bit hợp lệ. Nếu bạn chọn để giải thích nó như là int32 thì chắc chắn: bất cứ điều gì với bộ msb sẽ là tiêu cực ... và? –

+0

Cảm ơn giải pháp tuyệt vời. Tôi thực sự đã đi với nó. Nhưng các yêu cầu đã thay đổi một số điều nên tôi quyết định thử - nắm bắt là giải pháp đơn giản và sạch nhất – eric

2

Cảm ơn cho câu trả lời tuyệt vời và vô cùng nhanh chóng!

Yêu cầu của tôi không thay đổi. Bây giờ người dùng có thể nhập khá nhiều định dạng. Nhị phân, thập phân, hex. Vì vậy, tôi quyết định try - catch chỉ cung cấp giải pháp đơn giản và sạch nhất.

Vì vậy, chỉ để có biện pháp tốt, tôi đang đăng mã mà tôi đang sử dụng ngay bây giờ. Tôi nghĩ nó khá rõ ràng và thậm chí hơi tao nhã, hoặc vì vậy tôi nghĩ ^^.

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

Cảm ơn vì đã khuyến khích tôi sử dụng try - catch, tôi nghĩ nó thực sự cải thiện khả năng đọc mã của tôi.

Cảm ơn

+0

Điều gì, bạn không thích bát phân? Nghiêm túc, nếu một người nào đó bước vào '11' và có nghĩa là nó ở căn cứ 10 thì sao? Giải pháp chuẩn sẽ là sử dụng tiền tố ('0b', '', '0x'), nhưng điều đó có thể không phù hợp với yêu cầu của bạn. – outis

+0

Yeah no octal ^^. Người dùng thực sự phải chọn trong combobox định dạng mà cô ấy muốn sử dụng.Tôi cũng nghĩ về giải pháp của bạn, nhưng nó có vẻ dễ dàng hơn với một combobox. Cảm ơn bạn rất nhiều đầu vào. – eric

Các vấn đề liên quan