我有一个Datagridview,其单元格包含具有HH:mm格式的varchar值,当我需要对这些值求和时,我使用函数
private void CalcTime
{
string span = dataGridView1.Columns["Horas"].ToString();
double seconds = 0;
seconds = dataGridView1.Rows
.Cast<DataGridViewRow>()
.AsEnumerable()
.Sum(x => TimeSpan.Parse((x.Cells["Horas"].Value.ToString())).TotalSeconds);
string somat = "";
double segundosc = seconds;
somat = string.Format(
"{0:00}:{1:00}",
segundosc / 3600,
(segundosc / 60) % 60,
segundosc % 60);
}
如果值类似于01:00或03:00它可以,但如果我的值为01:30,则总和不起作用。如下所示:
如何让它正常工作? 此致
答案 0 :(得分:2)
问题是,秒的总和将是20400,当你将它除以3600时,你将获得5.666666。因为您的变量是double
并且您使用的格式为{0:00}
,所以该值将被舍入。您需要将总和转换为int
或使用Math.Floor
。
int seconds = (int)dataGridView1.Rows
.Cast<DataGridViewRow>()
.AsEnumerable()
.Sum(x => TimeSpan.Parse((x.Cells["Horas"].Value.ToString())).TotalSeconds);
OR
somat = string.Format(
"{0:00}:{1:00}",
Math.Floor(segundosc / 3600),
(segundosc / 60) % 60);
此外,您不需要string.Format
中的最后一个参数。
另一种选择是使用TimeSpan
转换回TimeSpan.FromSeconds
。
double seconds = dataGridView1.Rows
.Cast<DataGridViewRow>()
.AsEnumerable()
.Sum(x => TimeSpan.Parse((x.Cells["Horas"].Value.ToString())).TotalSeconds);
TimeSpan totalTime = TimeSpan.FromSeconds(seconds);
string somat = totalTime.ToString(@"hh\:mm");
答案 1 :(得分:0)
或者使用TimeSpan.Add
方法而不转换为秒并返回TimeSpan
类型
TimeSpan all = New TimeSpan(0);
foreach( DataGridViewRow dgvr In dataGridView1.Rows)
{
all = all.Add(TimeSpan.Parse(dgvr.Cells["Horas"].Value.ToString()));
}
string somat = all.ToString(@"hh\:mm");