Использование переключателя в С#: как завершить оператор, который я пытаюсь написать?

Я создаю программу, которая вычисляет комиссию для персонала на основе суммы продаж, я вычислил комиссионные, но мне все еще нужно написать оператор переключения, чтобы вернуть «Пожалуйста, введите сумму продаж еще раз», когда любое другое значение чем число вводится в 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, а не switch в этом случае.

Llama 19.03.2019 03:42

В этом случае используйте условие if...else....

Salomon Zhang 19.03.2019 03:43

это утверждение bool AmountIsNumber = double.TryParse(salesTextBox.Text, out salesAmount); бесполезно и равно var AmountIsNumber = true;, потому что, если salesTextBox.Text не "поддается анализу" double, вы получите FormatException на одну строку раньше.

vasily.sib 19.03.2019 03:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
58
4

Ответы 4

Не рекомендуется, но если вам нужно использовать switch

switch(!AmountIsNumber)
{
    case true: 
        MessageBox.Show(" Please re-enter the sales amount. ");
        break;
    case false:
        // your logic...
        break;
}

Спасибо за это, но когда я проверяю это, я получаю сообщение об ошибке SalesAmount = double.Parse(salesTextBox.Text);

Evan 19.03.2019 03:58

@ Эван Это другой вопрос. Вам нужно добавить ссылку using System.Globalization;, а затем double.TryParse(salesTextBox.Text, CultureInfo.InvariantCulture); Использование double.TryParse(), которое преобразует строковое представление числа в эквивалентное ему число двойной точности с плавающей запятой. Возвращаемое значение указывает, было ли преобразование успешным или неудачным. настоятельно рекомендуется вместо double.Parse().

Salomon Zhang 19.03.2019 04:08

только одно: using System.Globalization; это оператор использования, а не ссылка

vasily.sib 19.03.2019 04:22

Интересно, почему вы включаете !AmountIsNumber вместо AmountIsNumber? Не так ли, как у вас это немного сложнее читать?

Rufus L 19.03.2019 05:28

Подводя итог всем остальным ответам:

  1. Вы не можете отметить AmountIsNumber в своем первом switch утверждении только потому, что оно касается empTitle, а не salesAmount.

  2. Оператор 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
}

Другие вопросы по теме