我正在创建一个根据销售额计算员工佣金的程序,已经计算出了佣金计算,但是在发生以下情况时,我仍然需要编写一个切换语句以返回“请重新输入销售额”将除数字以外的任何其他值输入到salesTextBox中。
string empTitle;
double salesAmount;
double commAmt;
empTitle = employeeTextBox.Text;
salesAmount = double.Parse(salesTextBox.Text);
bool AmountIsNumber = double.TryParse(salesTextBox.Text, out salesAmount);
switch (empTitle)
{
case "PT1":
commAmt = (salesAmount * .1);
MessageBox.Show(" The commission is " + commAmt.ToString());
break;
case "PT2":
commAmt = (salesAmount * .15);
MessageBox.Show(" The commission is " + commAmt.ToString());
break;
case "S1":
commAmt = (salesAmount * .2);
MessageBox.Show(" The commission is " + commAmt.ToString());
break;
case "S2":
commAmt = (salesAmount * .25);
MessageBox.Show(" The commission is " + commAmt.ToString());
break;
default:
MessageBox.Show(" Please re-enter job title. ");
break;
}
employeeTextBox.Clear();
salesTextBox.Clear();
switch (!AmountIsNumber)
{
}
MessageBox.Show(" Please re-enter the sales amount. ");
return;
答案 0 :(得分:0)
不推荐,但是如果您必须使用switch
switch(!AmountIsNumber)
{
case true:
MessageBox.Show(" Please re-enter the sales amount. ");
break;
case false:
// your logic...
break;
}
答案 1 :(得分:0)
总结所有其他答案:
您不能仅在第一个AmountIsNumber
语句中检查switch
,因为它仅与empTitle
有关,而不与salesAmount
有关。
bool
的switch语句非常无用,因为它更容易编写
if (condition)
DoThis();
else
DoThat();
然后
switch (condition)
{
case true:
DoThis();
break;
case false:
DoThat();
break;
}
从您的代码开始,您可以这样重写它:
double salesAmount, commAmt;
if (double.TryParse(salesTextBox.Text, out salesAmount))
{
var message = ;
switch (employeeTextBox.Text)
{
case "PT1":
commAmt = (salesAmount * .1);
break;
case "PT2":
commAmt = (salesAmount * .15);
break;
case "S1":
commAmt = (salesAmount * .2);
break;
case "S2":
commAmt = (salesAmount * .25);
break;
default:
MessageBox.Show("Please re-enter job title.")
return;
}
MessageBox.Show($"The commission is {commAmt}");
employeeTextBox.Clear();
salesTextBox.Clear();
}
else
MessageBox.Show("Please re-enter the sales amount.");
此外,如果需要更多代码审查,则可以使用another stackexchange site。
建议1:
要保持文化中立,您需要将if (double.TryParse(salesTextBox.Text, out salesAmount))
替换为:
using System.Globalization;
// ...
var stringValue = salesTextBox.Text.Replace(',', '.');
if (double.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out salesAmount))
{
// now we can safely parse "3.14" and "3,14" to 3.14
建议2:
如果您的salesTextBox.Text
仅包含预定义的值-使用ComboBox
控件而不是TextBox
可能会更容易:
// somewhere in designer or in the form/control constructor:
employeeComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
employeeComboBox.Items.AddRange(new object[] { "PT1", "PT2", "S1", "S2" });
// in your switch statement:
switch (employeeComboBox.SelectedItem)
{
case "PT1":
commAmt = (salesAmount * .1);
break;
case "PT2":
commAmt = (salesAmount * .15);
break;
case "S1":
commAmt = (salesAmount * .2);
break;
case "S2":
commAmt = (salesAmount * .25);
break;
// now, we don't need the "default:" option here
}
答案 2 :(得分:0)
我已经对您的代码进行了一些重构。我想这就是你要写的。
if (decimal.TryParse(salesTextBox.Text, out decimal salesAmount))
{
Dictionary<string, decimal> commissions = new Dictionary<string, decimal>()
{
{ "PT1", 0.1m },
{ "PT2", 0.11m },
{ "S1", 0.2m },
{ "S2", 0.25m },
};
string empTitle = employeeTextBox.Text;
if (commissions.ContainsKey(empTitle))
{
decimal commAmt = salesAmount * commissions[empTitle];
MessageBox.Show($" The commission is {commAmt}");
employeeTextBox.Clear();
salesTextBox.Clear();
}
else
{
MessageBox.Show(" Please re-enter job title. ");
}
}
else
{
MessageBox.Show(" Please re-enter the sales amount. ");
}
请注意,在使用货币金额时,最好使用decimal
(货币价值)而不是double
(科学价值)。
答案 3 :(得分:0)
您的语法语句不明确! 您已经尝试从文本框中解析出文本,然后又要求尝试解析相同的文本,并要求它从第一条语句中取出结果,如果该语句不起作用,那么它肯定不会再次起作用。
salesAmount = double.Parse(salesTextBox.Text);
bool AmountIsNumber = double.TryParse(salesTextBox.Text, out salesAmount);
毫无疑问,这将是一个问题。 在尝试解析另一个值之前,最好为销售量分配一个已知值。
double salesAmount = -1;
double.TryParse(salesTextBox.Text, out salesAmount);
if (salesAmount != -1){
//then ok its a number
}
else
{
//its not a number
}