在许多销售点(PoS)软件应用程序或类似环境中,支付屏幕需要一个“支付金额输入”功能。支付值(货币)几乎总是包括一个小数点。因此,如果不处理小数点并将其留给用户,当用户输入多个小数点或简单地添加小数点时,它可能会(确实会!)成为一个失败点,从而改变总金额(例如,$10.25的支付变成了$102.50)。因此,要么必须检查该值,要么在按键级别捕获它。更好的方法是在输入点进行管理!
在Windows表单上添加按钮,并构建“价格数字键盘”:
使用了4x4的TableLayoutPanel。在键盘网格下方添加一个文本框,输出将放置在这里。
引入了一个公共字符串,它决定了键盘将扮演什么角色:
public string numberRole = "MONEY";
"Money"角色将为支付值设置一个阶段,其中将应用两位小数。例如,如果金额是10.25,将有以下步骤:
步骤1:0.01
步骤2:0.10
步骤3:1.02
步骤4:10.25
"DIGITS"角色将简单地将键盘变成一个没有小数点的数字。
还控制了小数点的数量和小数位数(预设为2)。
private void MakeAmount(string amountTxt)
{
decimal meanWhile;
txtValue.Text = txtValue.Text + amountTxt;
if (txtValue.Text.Length == 1)
{
txtValue.Text = "0.0" + txtValue.Text;
}
if (txtValue.Text.Length > 4)
{
meanWhile = Convert.ToDecimal(txtValue.Text) * 10;
txtValue.Text = meanWhile.ToString("G29");
}
}
如所见,根据拥有的内容,小数点会移动。对于每个数字,有相同的过程:
除了零,需要检查一些事情,所有其他Click事件都是相似的:
private void num2_Click(object sender, EventArgs e) {
if (numberRole == "DIGITS") { txtValue.Text = txtValue.Text + "2"; }
else MakeAmount(num2.Text); }
对于零:
private void num0_Click(object sender, EventArgs e)
{
decimal meanWhile;
if (numberRole == "DIGITS")
{
txtValue.Text = txtValue.Text + "0";
}
else
{
txtValue.Text = txtValue.Text + "0";
if (txtValue.Text.Length == 1)
{
txtValue.Text = "0.0" + txtValue.Text;
}
if (txtValue.Text.Length >= 4)
{
meanWhile = Convert.ToDecimal(txtValue.Text) * 10;
txtValue.Text = meanWhile.ToString("G29");
}
if (Convert.ToDecimal(txtValue.Text) < 1)
{
txtValue.Text = txtValue.Text + "0";
}
if (txtValue.Text.IndexOf(".") < 0)
{
txtValue.Text = txtValue.Text + ".00";
}
if (Convert.ToDecimal(txtValue.Text) > 1 && (txtValue.Text.Length - txtValue.Text.IndexOf(".") - 1 == 1))
{
txtValue.Text = txtValue.Text + "0";
}
}
}
numberpad showNumber = new numberpad(); showNumber.numberRole = "MONEY";
numberpad showNumber = new numberpad(); showNumber.numberRole = "DIGITS";