计算器应用小数点前置异常问题求助
计算器小数点显示异常问题
我开发的计算器所有功能均已正常运行,但存在一个异常:点击小数点按钮时,小数点最初会显示在数字前方,继续输入数字后才会移至正确位置。需要说明的是,我设置了计算器显示屏的数字从右向左显示。
相关代码
数字按钮示例代码
private void button0_Click(object sender, EventArgs e) { label1.Text = label1.Text + button0.Text; }
小数点按钮代码
public void buttonDot_Click(object sender, EventArgs e) { label1.Text = label1.Text + buttonDot.Text; buttonDot.Click -= buttonDot_Click; }
运算符按钮示例代码(以乘法为例)
public void buttonX_Click(object sender, EventArgs e) { if (label1.Text != "") { Answer.szFvalue = label1.Text; label1.Text = ""; } Answer.szOperator = "X"; if (label1.Text.Contains(".")) { buttonDot.Click -= buttonDot_Click; } else { buttonDot.Click += buttonDot_Click; } }
计算类代码
public string szFvalue; public string szOperator; public string Answering(string value) { if (szOperator == "X") { double Ans = Convert.ToDouble(szFvalue) * Convert.ToDouble(value); return Convert.ToString(Ans); } else if (szOperator == "/") { double Ans = Convert.ToDouble(szFvalue) / Convert.ToDouble(value); return Convert.ToString(Ans); } else if (szOperator == "+") { double Ans = Convert.ToDouble(szFvalue) + Convert.ToDouble(value); return Convert.ToString(Ans); } else if (szOperator == "-") { double Ans = Convert.ToDouble(szFvalue) - Convert.ToDouble(value); return Convert.ToString(Ans); } else if (szOperator == "^") { double Ans = (double)Math.Pow(Convert.ToDouble(szFvalue), 2); return Convert.ToString(Ans); } else if (szOperator == "Sqrt") { double Ans = Math.Sqrt(Convert.ToDouble(szFvalue)); return Convert.ToString(Ans); } else if (szOperator == "Log") { double Ans = Math.Log(Convert.ToDouble(szFvalue), 2); return Convert.ToString(Ans); } else { return "error"; } }
问题原因及解决方法
原因
因为显示屏设置了右对齐(从右向左显示),当显示屏为空时点击小数点,label1.Text会变成.,单个字符右对齐时会显示在最左侧,视觉上就像小数点在数字前方;输入数字后文本变为.123,整体右对齐,看起来小数点移到了正确位置,本质是右对齐的视觉效果导致的误解。
解决方法
- 修改小数点按钮逻辑:为空时自动补0,避免单独显示小数点
public void buttonDot_Click(object sender, EventArgs e) { // 空文本时先补0 if (string.IsNullOrEmpty(label1.Text)) { label1.Text = "0"; } // 避免重复添加小数点 if (!label1.Text.Contains(".")) { label1.Text += buttonDot.Text; buttonDot.Click -= buttonDot_Click; } }
- 修复运算符按钮的逻辑错误:原代码在清空
label1.Text后才判断是否包含小数点,此时文本为空永远不成立,需提前保存当前文本再判断
public void buttonX_Click(object sender, EventArgs e) { string currentText = label1.Text; if (currentText != "") { Answer.szFvalue = currentText; label1.Text = ""; } Answer.szOperator = "X"; // 用清空前的文本判断是否含小数点 if (currentText.Contains(".")) { buttonDot.Click -= buttonDot_Click; } else { buttonDot.Click += buttonDot_Click; } }
修改后,点击小数点时若显示屏为空,会先显示0.,右对齐时正常展示在右侧,输入数字后变为0.123,符合常规计算器的显示逻辑。
内容的提问来源于stack exchange,提问作者Daniel Heikkilä
相关产品推荐
相关产品推荐

