我试图制作一个计算器,而且我有点坚持使用mod和exp操作,每当我尝试使用它们时,我都会遇到错误:
System.FormatException:'输入字符串的格式不正确。'
这是发生错误的事件:
private void Equal_Click(object sender, EventArgs e)
{
switch (operationPerf)
{
case "+":
TB.Text = (result + Double.Parse(TB.Text)).ToString();
CO.Text = "";
break;
case "-":
TB.Text = (result - Double.Parse(TB.Text)).ToString();
CO.Text = "";
break;
case "*":
TB.Text = (result * Double.Parse(TB.Text)).ToString();
CO.Text = "";
break;
case "/":
TB.Text = (result / Double.Parse(TB.Text)).ToString();
CO.Text = "";
break;
case "Mod":
TB.Text = (result % Double.Parse(TB.Text)).ToString();
CO.Text = "";
break;
case "Exp":
TB.Text = Math.Exp(Double.Parse(TB.Text) * Math.Log((result) * 4)).ToString();
CO.Text = "";
break;
default:
break;
}
result = Double.Parse(TB.Text); // Here is where the error happens
CO.Text = "";
}
答案 0 :(得分:0)
可能operationPerf
不是预期的运算符,因此执行默认情况并且文本框仍然包含原始表达式(例如"23Exp3"
),当然,它不能转换为{ {1}}。
您应该将计算器逻辑与输入和输出分开。在单独的代码文件(Calculator.cs)中创建double
类
Calculator
它更容易理解,因为它只包含纯数学,不需要任何解析或格式化。
在表单字段中(在表单类的顶部),您可以声明
public class Calculator
{
public double Result { get; set; }
public void Calculate(string operation, double operand)
{
switch (operation)
{
case "+":
Result = Result + operand;
break;
case "-":
Result = Result - operand;
break;
case "*":
Result = Result * operand;
break;
case "/":
Result = Result / operand;
break;
case "Mod":
Result = Result % operand;
break;
case "Exp":
Result = Math.Exp(operand * Math.Log(Result * 4));
// Did you want this instead?
// Result = Math.Pow(Result, operand);
break;
default:
break;
}
}
}
事件处理程序也更容易
public partial class Form1 : Form
{
private Calculator _calculator = new Calculator();
...
}
如果文本框仍包含private void Equal_Click(object sender, EventArgs e)
{
if (Double.TryParse(TB.Text, out double operand)) {
_calculator.Calculate(operationPerf, operand);
TB.Text = _calculator.Result.ToString();
CO.Text = "";
} else {
MsgBox.Show("The TextBox does not contain a number");
}
}
,您将无法将其转换为"23Exp3"
。使用不同的文本框输入操作,操作符(数字)和结果,或将字符串分成三部分(2个数字和操作)。
我真的不理解double
背后的逻辑。由于我不知道预期的行为,我不能给你任何建议。您想要使用Math.Exp(operand * Math.Log(Result * 4))
吗?
Math.Pow
返回指定数量的指定数字。
答案 1 :(得分:0)
您要求用户输入以下内容: 10Exp3 。而且你希望你的程序将10提高到3的幂,然后显示结果。所以在这种情况下你期望1000。但你只是这样做:
case "Exp":
TB.Text = Math.Exp(Double.Parse(TB.Text) * Math.Log((result) * 4)).ToString();
您的代码的第一个问题是,您使用的是Exp
,因为这是Exp
的文档:
将e提升到指定的幂。
您希望将 e 提升到指定的电量吗?你不可以。所以你不能使用那种方法。但即使你可以并且想(也许你确实想要 e ),计算机无法将 10Exp3 转换为数字 - 你必须告诉它该怎么做。
以下是如何(更清晰地阅读我的评论内容):
var input = "10Exp3";
// Let's split the numbers using <Exp>
var splits = input.Split(new[] { "Exp" }, StringSplitOptions.None);
// Let's try and convert the first part into a double and see if it works
double numberBase = 0;
if (!double.TryParse(splits[0], out numberBase))
{
// The part before the word Exp is
// not a number, perhaps show an error to the user in a message box
}
// Now let's try and convert the second part
double exponent = 0;
if (!double.TryParse(splits[1], out exponent))
{
// The part after the word Exp is
// not a number, perhaps show an error to the user in a message box
}
// Now we will call the Pow method or use Math.Exp if you want e
double result = Math.Pow(numberBase, exponent);