0

私は現在、ユーザーがそのサービスの使用に費やした時間に基づいて、ユーザーがサービスに対して支払わなければならない価格を計算するアプリに取り組んでいます。料金は最初の 1 時間が 3.30 ドル、その後 30 分ごとに 1.15 ドルです。私のタイマーは次のようになります。

    private void timer()
    {
        DispatcherTimer timer = new DispatcherTimer();

        timer.Tick +=
            delegate(object s, EventArgs args)
            {
                TimeSpan time = (DateTime.Now - StartTime);

                this.Time.Text = string.Format("{0:D2}:{1:D2}:{2:D2}", time.Hours, time.Minutes, time.Seconds);
            };
        timer.Interval = new TimeSpan(0, 0, 1); // one second
        timer.Start();
    }

ポイントは、タイマーと支払う価格を画面に表示し、時間の経過とともに自動的に更新する必要があることです (タイマーは既にそれを行っています)。

値段自体は、if/elseとforeachの組み合わせで考えたのですが、今のところ何もできていません…

4

3 に答える 3

2

このようなもの。(部分的な時間の処理方法を省略したため、無視しました。)

double span = (DateTime.Now - StartTime).TotalHours;
decimal cost = 0.0;
if (span > 0)
    cost = 3.30 + ((span - 1) * 1.15);
于 2013-01-19T16:25:45.537 に答える
1

いくつかの注意:

  1. 現地時間ではなくUTC時間を使用します(Eric Lippertのコメントを参照)
  2. お金を表すdecimalのではなく使用するdouble
  3. 開始時間間隔を計算するにMath.Ceilingは、素晴らしいです。Math.Roundあなたがやりたいことをするためにフープを飛び越える必要はありません。
  4. 価格設定ロジックを、時計などの外部サービスと相互作用しない単純な副作用のない方法にカプセル化します。

    これにより、メソッドを個別にテストすることが容易になります。

  5. すべての定期的なUI更新に単一のタイマーを使用します(異なる間隔が必要な場合を除く)

私はそれを次のように書きます:

public decimal CostByTime(TimeSpan t)
{
  if(t < TimeSpan.Zero)
      throw new ArgumentOutOfRangeExeception("t", "Requires t>=0");
  if(t ==  TimeSpan.Zero)
      return 0;
  double hours = t.TotalHours;
  if(hours <= 1)
      return 3.30m;
  else
      return 3.30m + (int)Math.Ceiling((hours-1)*2) * 1.15m
}

そして、あなたの見解では、次のものを使用できます。

TimeSpan billableTime = DateTime.UtcNow - StartTime;
decimal cost = CostByTime(billableTime);

Time.Text = billableTime.ToString(...);
Cost.Text = cost.ToString();
于 2013-01-20T11:35:47.727 に答える
1

If the scheme is such that the cost is added as soon as a segment starts then you can calculate the number of half hours that have started, after the initial hour, as:

Math.Round((hours - 1) / 0.5 + 0.5)

And the cost is then calculated as:

double hours = (DateTime.UtcNow - StartTime).TotalHours;
double cost;
if (hours < 1)
    cost = 3.30;
else
    cost = 3.30 + Math.Round((hours - 1) / 0.5 + 0.5) * 1.15;
于 2013-01-19T16:39:33.603 に答える