我做了一个简单的二进制到十进制转换器,用来工作正常,我用一个字符串变量来声明值,但现在意识到我需要将它们存储为整数,因为我想在一段时间内添加循环结构验证用户选择,因此他们只能输入0或1。
但我现在有一个程序说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 :(得分:2)
iDecimalNum = Convert.ToInt32(iBinaryNum, 2);
您传递的参数是int, int
。如您所见here,您可以选择Object, IFormatProvider
,String, IFormatProvider
或String, Int32
。
由于第一个int只能用作Object
,这意味着第二个参数必须是IFormatProvider
。
如果你想要一个解决方案,你必须澄清你正在尝试做什么。为什么要将整数转换为整数?
答案 1 :(得分:2)
Convert.ToInt32(String, Int32)
要求第一个参数为String,第二个参数为整数。您正在传递两个整数,这会解析为生成错误的Convert.ToInt32(Object, IFormatProvider)
。您必须将第一个参数(iBinaryNum
)转换为String。
但我不认为你的代码按预期工作,因为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;
}
答案 2 :(得分: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();
答案 3 :(得分:0)
如果您查看Convert.ToInt32
的不同重叠,您会发现没有任何重载Int32, Int32
。
重载决策将选择代替object, IFormatProvider
且2
为Int32
的那个,而不是实现IFormatProvider
的类型,因此错误。
目前尚不清楚为什么要将Int32
转换为Int32
- 您已经拥有iBinaryNum
中的值。
答案 4 :(得分: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);