Я создаю программу, которая вычисляет комиссию для персонала на основе суммы продаж, я вычислил комиссионные, но мне все еще нужно написать оператор переключения, чтобы вернуть «Пожалуйста, введите сумму продаж еще раз», когда любое другое значение чем число вводится в 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;
В этом случае используйте условие if...else....
это утверждение bool AmountIsNumber = double.TryParse(salesTextBox.Text, out salesAmount); бесполезно и равно var AmountIsNumber = true;, потому что, если salesTextBox.Text не "поддается анализу" double, вы получите FormatException на одну строку раньше.





Не рекомендуется, но если вам нужно использовать switch
switch(!AmountIsNumber)
{
case true:
MessageBox.Show(" Please re-enter the sales amount. ");
break;
case false:
// your logic...
break;
}
Спасибо за это, но когда я проверяю это, я получаю сообщение об ошибке SalesAmount = double.Parse(salesTextBox.Text);
@ Эван Это другой вопрос. Вам нужно добавить ссылку using System.Globalization;, а затем double.TryParse(salesTextBox.Text, CultureInfo.InvariantCulture); Использование double.TryParse(), которое преобразует строковое представление числа в эквивалентное ему число двойной точности с плавающей запятой. Возвращаемое значение указывает, было ли преобразование успешным или неудачным. настоятельно рекомендуется вместо double.Parse().
только одно: using System.Globalization; это оператор использования, а не ссылка
Интересно, почему вы включаете !AmountIsNumber вместо AmountIsNumber? Не так ли, как у вас это немного сложнее читать?
Подводя итог всем остальным ответам:
Вы не можете отметить AmountIsNumber в своем первом switch утверждении только потому, что оно касается empTitle, а не salesAmount.
Оператор Switch bool совершенно бесполезен, так как его легче написать
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.");
Кроме того, если требуется дополнительная проверка кода, для этого есть другой сайт обмена стеками.
Предложение 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
}
Я сделал рефакторинг вашего кода. Я думаю, это то, что вы хотите написать.
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 (научные значения).
У вас неоднозначный синтаксис оператора! Вы пытались разобрать текст из текстового поля, затем вы попросили попробовать то же самое и попросили вывести результат из первого оператора, который, если он не сработал, то, безусловно, не сработает снова.
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
}
Кажется, вы хотите
if, а неswitchв этом случае.