我正在构建一个计算器应用程序(这是家庭作业,完全披露)并且让自己陷入了困境。其中一项要求是“确保您输入的数字不会超过9位。(即<1,000,000,000)”。
我真正想做的是将输入的数字限制为9位数并为运算符设置例外(+ - * /)
我尝试过的事情&gt;
我的solve方法要求整个表达式(包括运算符)在CurrentInput文本框中。如果我无法解决这个问题,我将不得不废弃我正在做的事情并以另一种方式做。这很不幸,因为我还使用Javascript构建了一个相同的计算器,我也必须重新执行此操作。在我走到这一步之前,我的傻瓜并没有考虑计算器的预期行为。根据要求(下面链接),似乎显示框仅显示数字并将当前操作员保持在单独的框中。我将当前操作员显示在“9”键的右侧,也显示在显示框中。
这是我的设计,我将彼此相邻的屏幕截图粘贴在一起,以便在一次连续操作中展示其行为。 450除以150 = 3然后如果操作员是下一个输入的输入,它将继续修改结果,因此:* 200 + 550 = 1150.如果数字是下一个输入的输入,它将结果发送到顶部显示,以便: 5 * 5 = 25.我真的不知道双显示计算器究竟应该如何工作,但这是我能想到的最好的。
这是我的ASP.Net代码:
<body>
<form id="CAsp" runat="server">
<div>
<asp:Table ID="Table1" runat="server">
<asp:TableHeaderRow runat="server">
<asp:TableHeaderCell CssClass="th" ColumnSpan="4" runat="server" Enabled="false">
<asp:TextBox ID="Result" runat="server"></asp:TextBox>
</asp:TableHeaderCell>
</asp:TableHeaderRow>
<asp:TableHeaderRow runat="server">
<asp:TableHeaderCell CssClass="th" ColumnSpan="4" runat="server" Enabled="false">
<asp:TextBox ID="CurrentInput" runat="server"></asp:TextBox>
</asp:TableHeaderCell>
</asp:TableHeaderRow>
<asp:TableRow CssClass="toprow" runat="server">
<asp:TableCell CssClass="topleft" runat="server">
<asp:Button ID="Seven" CssClass="smallbutton" runat="server" OnClick="Seven_OnClick" Text="7" /></asp:TableCell>
<asp:TableCell runat="server">
<asp:Button ID="Eight" CssClass="smallbutton" runat="server" OnClick="Eight_OnClick" Text="8" /></asp:TableCell>
<asp:TableCell runat="server">
<asp:Button ID="Nine" CssClass="smallbutton" runat="server" OnClick="Nine_OnClick" Text="9" /></asp:TableCell>
<asp:TableCell CssClass="topright" runat="server">
<asp:Button ID="OP" CssClass="OP" runat="server" Enabled="false" Text="" /></asp:TableCell>
</asp:TableRow>
<asp:TableRow runat="server">
<asp:TableCell runat="server">
<asp:Button ID="Four" CssClass="smallbutton" runat="server" OnClick="Four_OnClick" Text="4" /></asp:TableCell>
<asp:TableCell runat="server">
<asp:Button ID="Five" CssClass="smallbutton" runat="server" OnClick="Five_OnClick" Text="5" /></asp:TableCell>
<asp:TableCell runat="server">
<asp:Button ID="Six" CssClass="smallbutton" runat="server" OnClick="Six_OnClick" Text="6" /></asp:TableCell>
<asp:TableCell runat="server">
<asp:Button ID="Clear" CssClass="smallbutton" runat="server" OnClick="Clear_OnClick" Text="C" /></asp:TableCell>
</asp:TableRow>
<asp:TableRow runat="server">
<asp:TableCell runat="server">
<asp:Button ID="One" CssClass="smallbutton" runat="server" OnClick="One_OnClick" Text="1" /></asp:TableCell>
<asp:TableCell runat="server">
<asp:Button ID="Two" CssClass="smallbutton" runat="server" OnClick="Two_OnClick" Text="2" /></asp:TableCell>
<asp:TableCell runat="server">
<asp:Button ID="Three" CssClass="smallbutton" runat="server" OnClick="Three_OnClick" Text="3" /></asp:TableCell>
<asp:TableCell runat="server">
<asp:Button ID="Divide" CssClass="smallbutton" runat="server" OnClick="Divide_OnClick" Text="/" /></asp:TableCell>
</asp:TableRow>
<asp:TableRow runat="server">
<asp:TableCell runat="server">
<asp:Button ID="Zero" CssClass="smallbutton" runat="server" OnClick="Zero_OnClick" Text="0" /></asp:TableCell>
<asp:TableCell CssClass="topright" runat="server">
<asp:Button ID="Plus" CssClass="smallbutton" runat="server" OnClick="Plus_OnClick" Text="+" /></asp:TableCell>
<asp:TableCell runat="server">
<asp:Button ID="Minus" CssClass="smallbutton" runat="server" OnClick="Minus_OnClick" Text="-" /></asp:TableCell>
<asp:TableCell runat="server">
<asp:Button ID="Multiply" CssClass="smallbutton" runat="server" OnClick="Multiply_OnClick" Text="*" /></asp:TableCell>
</asp:TableRow>
<asp:TableRow CssClass="bottomrow" runat="server">
<asp:TableCell CssClass="bottomcell" ColumnSpan="4" runat="server">
<asp:Button ID="Equals" CssClass="longbutton" runat="server" OnClick="Equals_OnClick" Text="=" /></asp:TableCell>
</asp:TableRow>
</asp:Table>
<div align="center">
<asp:RegularExpressionValidator ID="REV1" runat="server" ForeColor="red" ErrorMessage="Max Characters is 9, Use Backspace" ControlToValidate="CurrentInput" Display="Dynamic" ValidationExpression="^[0-9+-/*\s]{0,9}$" /></div>
</div>
</form>
这是我的C#代码隐藏:
public partial class CalcAsp : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
public void Equals_OnClick(object sender, EventArgs e)
{
try
{
string Input = CurrentInput.Text;
DataTable datatable = new DataTable();
Object result;
result = datatable.Compute(Input, null);
CurrentInput.Text = result.ToString();
OP.Text = "=";
}
catch
{
CurrentInput.Text = "Error";
}
}
protected void Clear_OnClick(object sender, EventArgs e)
{
CurrentInput.Text = "";
Result.Text = "";
OP.Text = "";
}
protected void Plus_OnClick(object sender, EventArgs e)
{
if (CurrentInput.Text == "")
{
ScriptManager.RegisterStartupScript(this, GetType(), "alertMessage", "alert('Enter A Digit!');", true);
}
else
{
CurrentInput.Text = CurrentInput.Text + "+";
OP.Text = "+";
}
}
protected void Minus_OnClick(object sender, EventArgs e)
{
if (CurrentInput.Text == "")
{
ScriptManager.RegisterStartupScript(this, GetType(), "alertMessage", "alert('Enter A Digit!');", true);
}
else
{
CurrentInput.Text = CurrentInput.Text + "-";
OP.Text = "-";
}
}
protected void Multiply_OnClick(object sender, EventArgs e)
{
if (CurrentInput.Text == "")
{
ScriptManager.RegisterStartupScript(this, GetType(), "alertMessage", "alert('Enter A Digit!');", true);
}
else
{
CurrentInput.Text = CurrentInput.Text + "*";
OP.Text = "*";
}
}
protected void Divide_OnClick(object sender, EventArgs e)
{
if (CurrentInput.Text == "")
{
ScriptManager.RegisterStartupScript(this, GetType(), "alertMessage", "alert('Enter A Digit!');", true);
}
else
{
CurrentInput.Text = CurrentInput.Text + "/";
OP.Text = "/";
}
}
public void Zero_OnClick(object sender, EventArgs e)
{
if (OP.Text == "=")
{
Result.Text = CurrentInput.Text;
CurrentInput.Text = "0";
}
else
{
CurrentInput.Text = CurrentInput.Text + "0";
}
}
public void One_OnClick(object sender, EventArgs e)
{
if (OP.Text == "=")
{
Result.Text = CurrentInput.Text;
CurrentInput.Text = "1";
}
else
{
CurrentInput.Text = CurrentInput.Text + "1";
}
}
public void Two_OnClick(object sender, EventArgs e)
{
if (OP.Text == "=")
{
Result.Text = CurrentInput.Text;
CurrentInput.Text = "2";
}
else
{
CurrentInput.Text = CurrentInput.Text + "2";
}
}
protected void Three_OnClick(object sender, EventArgs e)
{
if (OP.Text == "=")
{
Result.Text = CurrentInput.Text;
CurrentInput.Text = "3";
}
else
{
CurrentInput.Text = CurrentInput.Text + "3";
}
}
protected void Four_OnClick(object sender, EventArgs e)
{
if (OP.Text == "=")
{
Result.Text = CurrentInput.Text;
CurrentInput.Text = "4";
}
else
{
CurrentInput.Text = CurrentInput.Text + "4";
}
}
protected void Five_OnClick(object sender, EventArgs e)
{
if (OP.Text == "=")
{
Result.Text = CurrentInput.Text;
CurrentInput.Text = "5";
}
else
{
CurrentInput.Text = CurrentInput.Text + "5";
}
}
protected void Six_OnClick(object sender, EventArgs e)
{
if (OP.Text == "=")
{
Result.Text = CurrentInput.Text;
CurrentInput.Text = "6";
}
else
{
CurrentInput.Text = CurrentInput.Text + "6";
}
}
protected void Seven_OnClick(object sender, EventArgs e)
{
if (OP.Text == "=")
{
Result.Text = CurrentInput.Text;
CurrentInput.Text = "7";
}
else
{
CurrentInput.Text = CurrentInput.Text + "7";
}
}
protected void Eight_OnClick(object sender, EventArgs e)
{
if (OP.Text == "=")
{
Result.Text = CurrentInput.Text;
CurrentInput.Text = "8";
}
else
{
CurrentInput.Text = CurrentInput.Text + "8";
}
}
protected void Nine_OnClick(object sender, EventArgs e)
{
if (OP.Text == "=")
{
Result.Text = CurrentInput.Text;
CurrentInput.Text = "9";
}
else
{
CurrentInput.Text = CurrentInput.Text + "9";
}
}
protected void backSpace_Click(object sender, EventArgs e)
{
String str = CurrentInput.Text;
int len;
len = str.Length;
CurrentInput.Text = "";
for (int i = 0; i < len - 1; i++)
{
CurrentInput.Text = CurrentInput.Text + Convert.ToString(str[i]);
}
}
}
感谢您的任何指示。我一直在阅读stackoverflow多年,所以我认为我是在这个问题的社区规范内,但这是我的第一篇文章。 :)
答案 0 :(得分:0)
您可以使用MaskedEdit Validator
中的AjaxControlToolkit
。它为您的文本框设置了预定义的格式,并阻止用户输入除此之外的任何内容。我在我的一个项目中使用了这个控件,它就像一个魅力。控件的行为在运行时在javascript中呈现,它可以提供流畅的用户体验,而无需回发到服务器。
更多详情 - http://www.ajaxcontroltoolkit.com/MaskedEdit/MaskedEdit.aspx
如果您需要进一步的帮助,请告诉我。
答案 1 :(得分:0)
首先,我将创建一个方法来处理点击次数。然后更改您的插入代码以包含某种计数器。这样的事情可能有用:
protected void InsertNumber(int number)
{
int numberCount = 0;
for (int i = 0; i < CurrentInput.Text.Length; i++)
{
try
{
if (Enumberable.Range(0, 9).Contains(Convert.ToInt32(CurrentInput.Text.Substring(i, 1))))
{
numberCount++;
}
}
catch
{
// Do nothing?
}
}
if (numberCount <= 9)
{
if (OP.Text == "=")
{
Result.Text = CurrentInput.Text;
CurrentInput.Text = number.ToString();
}
else
{
CurrentInput.Text += number.ToString();
}
}
}
// Exacmple usage, apply to all buttons
protected void Nine_OnClick(object sender, EventArgs e)
{
InsertNumber(9);
}
我目前无法测试,但它应该有用。