2013-11-17 6 views
2

Я сделал простой двоичный десятичный конвертер, используемый для работы отлично, я использовал строковую переменную для объявления значений, но теперь понимаю, что мне нужно будет хранить их как целые числа, как Я хотел добавить структуру цикла while для проверки выбора пользователей, чтобы они могли вводить только 0 или 1.Простой двоично-десятичный преобразователь - Проблема в C#

Но теперь у меня есть программа, которая говорит Cannot convert from 'int' to 'System.IFormatProvider' .. Так как я новичок в C#,

Я понятия не имею, что это значит, и как по прибывшему проблему, любая помощь приветствуется .. Вот мой код, если кто-то хочет посмотреть на него:

 int iBinaryNum; //To store binary number 
     int iDecimalNum; //To store decimal numbers 

     //Validation of user choice & main program 
     while (iBinaryNum == 0 || iBinaryNum == 1) 
     { 
      Console.WriteLine("Enter the binary number you want to convert to decimal"); 
      iBinaryNum = Convert.ToInt32(Console.ReadLine()); 

      Console.WriteLine("The Binary number you have entered is " + iBinaryNum); 
      iDecimalNum = Convert.ToInt32(iBinaryNum, 2); 

      Console.WriteLine("This converted into decimal is " + iDecimalNum); 
     } 

     //If it's not equal to 0 or 1 
     Console.WriteLine("Invalid binary number, Please re-enter"); 

     //Prevent program from closing 
     Console.WriteLine("Press any key to close"); 
     Console.ReadKey(); 
+0

Ваш код не имеет смысла. –

+0

Почему бы и нет? Раньше я работал с iBinaryNum как строкой (sBinaryNum), и он работал нормально, но мне нужно проверить выбор пользователей, поэтому я подумал, что, возможно, преобразование его в int позволило бы мне это сделать? Итак, какая часть не имеет смысла? – Tom

+0

Я не думаю, что вам нужен цикл while, вы можете использовать if, а затем недействительный консольный оператор сообщения должен находиться в блоке else –

ответ

1

Полное решение:

Вы можете использовать Regular Expressions проверку на определенные pattern в Input String

Следующая program примет Binary ввод от пользователя и преобразует его в decimal до недействительное значение Найдено

 string strBinaryNum=""; //To store binary number 
     int iDecimalNum; //To store decimal numbers 
     System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex("^[0-1]+$"); 

     Console.WriteLine("Enter the binary number you want to convert to decimal"); 
     strBinaryNum = Console.ReadLine(); 
     while(r.Match(strBinaryNum).Success) 
     {   
     Console.WriteLine("The Binary number you have entered is " + strBinaryNum); 
     iDecimalNum = Convert.ToInt32(strBinaryNum, 2);    
     Console.WriteLine("This converted into decimal is " + iDecimalNum); 

     Console.WriteLine("Enter the binary number you want to convert to decimal"); 
     strBinaryNum = Console.ReadLine(); 
     } 
     Console.WriteLine("Press any key to close"); 
     Console.ReadKey(); 
+0

Да, спасибо, я разобраю это после, просто действительно нужно решить эту проблему в минуту, Любой шанс вы могли бы лучше объяснить, что другие означают? Спасибо :) – Tom

+0

@ user2985995: уверенный, что я помогу вам, но как первый пункт, ваш iBinaryNum содержит двоичное значение правильно? ex: 1100111, правильно? –

+0

Да, пользователь вводит двоичное число, которое хранится в iBinaryNum – Tom

2
iDecimalNum = Convert.ToInt32(iBinaryNum, 2); 

аргументы вы прошли в int, int. Как вы можете видеть here, вы можете выбрать между Object, IFormatProvider, String, IFormatProvider или String, Int32.

Поскольку первый int может использоваться только как Object, это означает, что второй аргумент должен быть IFormatProvider.

Если вы хотите получить решение, вам нужно будет уточнить, что именно вы пытаетесь сделать. Почему вы хотите преобразовать целое число в целое?

+0

Я не уверен, я большой noob на C#, мне сказали, что я собираюсь представить целые числа, начиная с их преобразования, а затем позже используя их .. Так что я предполагаю, что это неправильно? Я просто хочу иметь возможность конвертировать двоичные числа в десятичные числа, которые отлично работали с использованием строки, но проблема возникла, поскольку я не мог использовать такие операторы, как «||», в строках, любые предложения? Спасибо – Tom

2

Convert.ToInt32(String, Int32) требует, чтобы первый аргумент был строкой, а второй - целым числом. Вы передаете два ints, которые разрешают Convert.ToInt32(Object, IFormatProvider), который генерирует ошибку. Вам нужно преобразовать первый аргумент (iBinaryNum) в строку.

Но я не думаю, что ваш код работает так, как вы ожидаете, поскольку условие while проверяет, является ли только один из значений int 1 или 0. Если пользователь вводит 1110, он терпит неудачу. Кроме того, если пользователь вводит что-либо выше Int32.Max (что не удивительно, учитывая, как большие двоичные числа могут расти), ваша программа сработает. Я бы сохранил ввод пользователя в строке снова и проверил каждый символ, содержит ли он действительные символы (1 или 0).

Как это:

bool IsBinaryNumber(string test){ 
     foreach(char c in test){ 
      // If c is not either 0 or 1, break. 
      if(!((c=='0') || (c== '1'))){ 
       return false; 
      } 
     } 
     // If everything went well, it's a binary number. 
     return true; 
} 
+0

Alrite много благодарен, я дам, что сейчас, я вижу, откуда вы пришли, я рассмотрю этот метод «String.Contains()», никогда не слышал, если это раньше, спасибо. – Tom

+0

@ Lennart: я не думаю, что проверка только для o или 1 не решает проблему с использованием метода Contains(), поскольку она будет реализована, если строка ввода содержит что-то вроде 0178, и, суровая ее недействительная бинарная, пожалуйста, исправьте меня, если я не прав. –

+0

Да, ты прав. Я добавил альтернативу. – Lennart

0

Если вы посмотрите на другую перегрузку Convert.ToInt32, вы увидите, нет ни одного, который принимают в качестве параметров Int32, Int32.

Разрешение перегрузки выбрать тот, который принимает object, IFormatProvider вместо и 2 является Int32, а не тип, который реализует IFormatProvider, следовательно, ошибка.

Непонятно, почему вы пытаетесь преобразовать Int32 в Int32 - у вас уже есть значение в iBinaryNum.

0

Я не уверен, что я действительно понимаю проблему. Однако вот цикл, который сохранит единственное продолжение, как только будут выполнены требования к двоичному номеру.

uint iBinaryNum = 2; //To store binary number 
decimal iDecimalNum; //To store decimal numbers 

//Validation of user choice & main program 
while (iBinaryNum > 1) 
{ 
    Console.Write("Enter the binary number you want to convert to decimal: "); 
    if (!uint.TryParse(Console.ReadLine(), out iBinaryNum) || iBinaryNum > 1) 
    { 
     //If it's not equal to 0 or 1 
     Console.WriteLine("Invalid binary number, Please re-enter"); 
     iBinaryNum = 2; 
    } 
} 

iDecimalNum = Convert.ToDecimal(iBinaryNum); 
Console.WriteLine("This converted into decimal is " + iDecimalNum); 
+0

Спасибо большое, я дам ему сейчас – Tom

+0

Нет, не работает? – Tom

+0

О, я думаю, я полностью пропустил то, что вы пытаетесь сделать. Итак, вы пытаетесь преобразовать что-то вроде 11001001001 в его обычный цифровой эквивалент? –

Смежные вопросы