限制在文本框中输入的连续数字[计算器应用]

时间:2015-06-22 14:58:30

标签: c# asp.net

我正在构建一个计算器应用程序(这是家庭作业,完全披露)并且让自己陷入了困境。其中一项要求是“确保您输入的数字不会超过9位。(即<1,000,000,000)”。

我真正想做的是将输入的数字限制为9位数并为运算符设置例外(+ - * /)

我尝试过的事情&gt;

  • 使用RegularExpressionValidator,虽然我可以使用它来限制文本,但它不太理想。
  • 创建一个整数用作代码隐藏中的计数器,并且每个输入都是一个数字,将计数器增加1,每个操作符将其重置为0.然后,当按下任何数字键时,请检查它查看Counter&gt; = 9并让它显示警告(如果是)。这就是我真正希望能工作但我没有运气。

我的solve方法要求整个表达式(包括运算符)在CurrentInput文本框中。如果我无法解决这个问题,我将不得不废弃我正在做的事情并以另一种方式做。这很不幸,因为我还使用Javascript构建了一个相同的计算器,我也必须重新执行此操作。在我走到这一步之前,我的傻瓜并没有考虑计算器的预期行为。根据要求(下面链接),似乎显示框仅显示数字并将当前操作员保持在单独的框中。我将当前操作员显示在“9”键的右侧,也显示在显示框中。

Requirements

这是我的设计,我将彼此相邻的屏幕截图粘贴在一起,以便在一次连续操作中展示其行为。 450除以150 = 3然后如果操作员是下一个输入的输入,它将继续修改结果,因此:* 200 + 550 = 1150.如果数字是下一个输入的输入,它将结果发送到顶部显示,以便: 5 * 5 = 25.我真的不知道双显示计算器究竟应该如何工作,但这是我能想到的最好的。

Design&Behavior

这是我的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多年,所以我认为我是在这个问题的社区规范内,但这是我的第一篇文章。 :)

2 个答案:

答案 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);
}

我目前无法测试,但它应该有用。