我正在开发一个项目,用于计算用户输入的两次不同时间的通话费用。我已将数据解析为代码DateTime
。
DateTime starttime = new DateTime(Convert.ToDateTime(cal1.SelectedDate).Year,Convert.ToDateTime(cal1.SelectedDate).Month,Convert.ToDateTime(cal1.SelectedDate).Day,
Convert.ToInt32(drpdwn1.SelectedValue),
Convert.ToInt32(drpdwn2.SelectedValue),
Convert.ToInt32(drpdwn3.SelectedValue));
DateTime endtime = new DateTime(Convert.ToDateTime(cal1.SelectedDate).Year, Convert.ToDateTime(cal1.SelectedDate).Month, Convert.ToDateTime(cal1.SelectedDate).Day,
Convert.ToInt32(drpdwn4.SelectedValue),
Convert.ToInt32(drpdwn5.SelectedValue),
Convert.ToInt32(drpdwn6.SelectedValue));
并减去两者以获得一个时间跨度。
TimeSpan duration3 = (endtime - starttime);
txtDisplay.Text = duration3.ToString();
有人可以帮我找到将$ 0.35乘以timespan
duration3 的方法吗?
这是我现在正在使用的,但文本框一直显示0
double mins = duration3.Minutes;
double hrs = duration3.Hours;
double cost = ((hrs * 60) + mins) * 0.35;
txtCost.Text = cost.ToString();
//$0.35/min
// ((0.35*60)*hr + 0.35*min)
答案 0 :(得分:2)
可能是这样的:
static decimal Foo(TimeSpan duration, decimal perMinuteRate)
=> ((decimal)duration.TotalMinutes) * perMinuteRate;
虽然注意到TotalMinutes
是double
,但如果您的持续时间非常小,则可能出现意外舍入。
答案 1 :(得分:1)
最好这样做,所以你不要干扰双精度错误:
public static decimal MultiplyPerMinute(TimeSpan a, decimal b)
{
return a.Ticks * b / TimeSpan.TicksPerMinute;
}
当您使用小数时,只有双倍或浮动应该在任何可能的运算符中吓跑你。 Decimal是一种专门用于数字和精确耐用操作的类型。
答案 2 :(得分:0)
如上所述,问题不是很清楚。真的有两个问题:
问题1不清楚 - 可以通过多种方式解释。通过阅读发布的代码,评论和其他答案,可以看出您正在尝试计算TimeSpan的成本,并给出每分钟的成本"。为什么不问这个问题?
但这不是您的问题 - 您发布的代码确实表明您已了解如何计算TimeSpan的成本,并考虑到每分钟的成本",问题在于你的"文本框一直显示0"。
从发布的代码中,我不知道为什么会这样。但是,遵循一些良好的调试实践应该可以很快帮助您自己缩小问题范围。
请参阅Eric Lippert发表的一篇文章的链接,您会觉得有用: How to debug small programs
答案 3 :(得分:-1)
无需自己计算分钟数 - 乘法很容易:
TimeSpan ts = DateTime.Now - DateTime.Today;
var cost = ((int)ts.TotalMinutes) * 0.35m; // cost per minute, edited wrongly used 0.63m
我int
输出TotalMinutes的小数,以避免23.2832的结算;)