Как увеличить дубль на 3% - PullRequest
0 голосов
/ 07 июня 2018

Я бы хотел, чтобы цена менялась всякий раз, когда флажок установлен, и возвращался обратно, если он не отмечен.

Это то, что у меня есть:

if (chkbBreakfast.Checked) // checks if breakfast is checked 
{
    sBreakFast = "Yes";
    CGlobals.sBreakFast = "YES";

    double dPercent;
    dPercent = 0.03;

    double dtotal = Convert.ToDouble(CGlobals.sPrice) * dPercent / 100;

    CGlobals.sPrice = Convert.ToString(dtotal);

    lblTotalCost.Text = CGlobals.sPrice;
}
else
    sBreakFast = "No";

Ответы [ 4 ]

0 голосов
/ 07 июня 2018

Вы усложняете себе жизнь, вкладывая логику в свой интерфейс.У вас есть класс, в который вы уже помещаете значения, поэтому сделайте так, чтобы он работал для вас, и поддерживайте чистый интерфейс.

Для начала определите enum для вашего значения Breakfast - избегайте строк и избегайте логических значенийза это.Ваш код будет намного легче читать.

Тогда ваш класс CGlobals должен быть определен следующим образом:

public static class CGlobals
{
    public static Breakfast Breakfast = Breakfast.No;
    public static decimal BreakfastPremium = 1.03m;
    public static decimal BasePrice = 10m;
    public static decimal FinalPrice
    {
        get
        {
            return BasePrice * (Breakfast == Breakfast.Yes ? BreakfastPremium : 1m);
        }
    }
}

Все детали и бизнес-правила хранятся там.Тогда ваш пользовательский интерфейс очень прост:

CGlobals.Breakfast = chkbBreakfast.Checked ? Breakfast.Yes : Breakfast.No;
lblTotalCost.Text = CGlobals.FinalPrice.ToString();

Вот и все.Нет if заявления.Нет расчетов в вашем интерфейсе.Просто.

В идеале CGlobals не должно быть static class - но это совсем другой разговор.Пока все должно быть хорошо, но не придерживайтесь этого паттерна в течение длительного времени, так как это причинит вам много боли.

0 голосов
/ 07 июня 2018

Вам необходимо изменить свой расчет.Я предполагаю, что значение dPercent указано в десятичном формате, поэтому 3% = 0,03

var dPercent = 0.03;
if (chkbBreakfast.Checked) // checks if breakfast is checked 
{
    sBreakFast = "Yes";

    var dtotal = Convert.ToDouble(CGlobals.sPrice) * (1 + dPercent);

    CGlobals.sPrice = Convert.ToString(dtotal);
}
else
{
    var dtotal = Convert.ToDouble(CGlobals.sPrice) / (1 + dPercent);

    CGlobals.sPrice = Convert.ToString(dtotal);
}

lblTotalCost.Text = CGlobals.sPrice;
0 голосов
/ 07 июня 2018

Обратите внимание, что у вас есть две отдельные области хранения для значения: CGlobals.sPrice и lblTotalCost.Text.Вы пытаетесь показать измененную (+ 3%) цену пользователю.Вы правильно определили, что когда вы перезаписываете значение повсеместно, возврат к старому значению становится менее чем очевидным, поскольку вам потребуется создать противоположный расчет.Делать двойную работу никогда не бывает хорошо.

С этой целью я предлагаю вам изменить следующее:

  • Измените CGlobals.Price на десятичное число.
  • CGlobals.Price всегда будет хранить базовую цену (без 3%)
  • Содержимое lblTotalCost будет установлено на правильную цену (с или без 3%)

Отредактировал несвязанный код для удобства чтения:

if (chkbBreakfast.Checked) // checks if breakfast is checked 
{
    lblTotalCost.Text = CGlobals.Price * 1.03;
}
else
{
    lblTotalCost.Text = CGlobals.Price;
}

Некоторые вещи для упоминания:

  • Обратите внимание, что вам не нужночтобы изменить значение CGlobals.Price больше, или, по крайней мере, не для этой конкретной части логики.
  • Обратите внимание, что вам не нужно явно преобразовывать CGlobals.Price в строку, чтобы поместить его в качестветекст метки.В C # каждый объект по своей природе может быть приведен к строке.Для типов C # (таких как числовые типы) вам не нужно беспокоиться о преобразовании в строку.
  • Я предполагаю, что s в sPrice, потому что это строка.На мой взгляд, добавление имени переменной с подсказками об их типе не очень хорошая практикаЭто затрудняет читабельность без какой-либо оправданной выгоды.
  • Другие уже указали на ошибку в ваших расчетах.Они правы в этом, но просто повторю:
    • Вы берете процент с процента.Либо установите dPercent = 3, либо удалите / 100.
    • Ваша формула делает price * 0.03.За 100 долларов - 3 доллара.Это не добавление 3% к цене, это вычисление 3% само по себе.Для того, чтобы добавить его к существующей цене, вам нужно сделать total = price + (price * 0.03).Это математический эквивалент price * 1.03.
  • Вы упоминаете, что используете статические переменные для отображения одной и той же информации в приложении.Я бы посоветовал против этого, но это не по теме для вашего текущего вопроса.
    • Однако если вам нужно, чтобы пересчитанная цена была доступна во всех формах, и вы не собираетесь прекращать использование статики, тогда я предлагаю вам сделать следующее:
    • Сделать вторую статическую переменнуюназывается CGlobals.PriceCalculated (десятичное число).
    • В приведенном выше коде, когда вы устанавливаете текст метки, также установите для CGlobals.PriceCalculated то же значение (число).
    • Вы также можете сделать CGlobals.PriceCalculated строка, но лучше сохранить ее как число, и пользовательский интерфейс преобразует ее в строку, когда это необходимо.Это означает, что вам не нужно постоянно преобразовывать строку обратно в число.
    • CGlobals.Price по-прежнему будет содержать только базовую цену, но не пересчитанную цену.
0 голосов
/ 07 июня 2018

Есть некоторые проблемы: вы храните свою цену в глобальной переменной, которая определяется как string - это не должно быть, вы должны объявить ее как decimal (как указано в комментариях).

Теперь, если вы хотите, чтобы все это увеличивалось и уменьшалось на 3% в зависимости от значения в флажке, разумно поместить весь этот код в событие checkbox CheckedChanged.Я сделал это в приведенном ниже коде.

И причина, по которой ваш код не работает, заключается в следующем: вы объявляете свой процент как 0.03, а затем умножаете на dPercent / 100, что неверно, потому что это 0.03%!Вот почему это не работает.

Ниже я дам вам код, который должен помочь вам начать:)

private void chkbBreakfast_CheckedChanged(object sender, EventArgs e)
{
    if (chkbBreakfast.Checked) // checks if breakfast is checked 
    {
        sBreakFast = "Yes";
        // for this code to work, you must delcare sPrice as decimal
        CGlobals.sPrice *= 1.03;
    }
    else
    {
        sBreakFast = "No";
        // to revert increasing by 3%
        CGlobals.sPrice /= 1.03;
    }
    //you have to check, if you want this global variable set here
    CGlobals.sBreakFast = sBreakFast;
    lblTotalCost.Text = CGlobals.sPrice.ToString();
}
...