程序代码:
private void Mone()
{
//此处,如果出现2个包夜时段,会出错...........就是跨了2天以上........
try
{
//收费多少元
int money = 0;
//进出时间
DateTime intime, outtime;
intime = inTime.Value;
outtime = outTime.Value;
//免费分钟数
int nomoney;
nomoney = int.Parse(textBox1.Text);
//起价分钟数
int startTime;
startTime = int.Parse(textBox2.Text);
//起价
int startMoney;
startMoney = int.Parse(textBox3.Text);
//步进时间
int stepTime;
stepTime = int.Parse(textBox4.Text);
//步进价格
int stepMoney;
stepMoney = int.Parse(textBox5.Text);
//包夜价格
int nightMoney;
nightMoney = int.Parse(textBox6.Text);
//包夜时长
int nightTime;
nightTime = int.Parse(textBox9.Text);
//包夜有隔天
bool isNextDay;
isNextDay = checkBox1.Checked;
//第一次累加
bool isFirst = true;
//最小包夜时间
int minNight;
minNight = int.Parse(textBox7.Text);
//包夜开始时间,结束时间
DateTime bystart, byend;
if (isNextDay)
{
//包夜时段是隔天的
byend = byout.Value; //日期部分,当日
bystart = byin.Value; //日期部分,当日
if (byend < intime & intime < bystart & byend < outtime & outtime < bystart)
{
//上机时间没有包夜,正常计费
TimeSpan ts = outtime - intime;
int minu = (int)ts.TotalMinutes; //用了多少分钟
if (minu <= nomoney) //免费分钟内,不收费
{ money = 0; }
else if (minu > nomoney & minu < startTime)//超过免费分钟,小于起价时间
{
money = startMoney;//起步价
}
else if (minu > startTime)//超过起价时间
{
// (总时间-起价时间)/步进时间 向上取整(不足步进时间,按步进时间算) * 步进价格 + 起价
// Math.Floor 向下取整
money = ((int)Math.Ceiling((double)((minu - startTime) / stepTime))) * stepMoney + startMoney;
}
}
else
{
//上机时间有包夜
//循环累加进场时间,每累加1次,判定各种条件
while (intime < outtime)//一直循环,直到等式不成立
{
if (byend < intime & intime < bystart)//未进入包夜时段的计费
{
if (isFirst) //第一次累加,要算基本费(起价)
{
TimeSpan tp = bystart - intime;
int minu = (int)tp.TotalMinutes; //用了多少分钟
if (minu < nomoney) //免费分钟内,不收费
{ money = 0; }
else if (minu > nomoney & minu < startTime)//超过免费分钟,小于起价时间
{
money = startMoney;//起步价
intime = intime.AddMinutes(startTime);
}
else if (minu > startTime)//超过起价时间
{
money = startMoney;
intime = intime.AddMinutes(startTime);
}
isFirst = false;
}
else //算过起价之后
{
TimeSpan tp = bystart - intime;
int minu = (int)tp.TotalMinutes; //用了多少分钟
money += stepMoney;
intime = intime.AddMinutes(stepTime);
isFirst = false;
}
}
else if (intime >= bystart & intime <= byend.AddDays(1) || bystart.AddDays(-1) < intime & intime < byend) //包夜时段跨天,结束包夜时间,日期+1
{
//进入包夜计费时段
//先判定,包夜时间长短,短的按正常计费
TimeSpan tn = byend - intime;//此处的intime是累加过的,不是初始的进来时间
if ((int)tn.TotalMinutes < minNight) // 在包夜时间段内的停留时间,小于最小包夜时间,按正常收费
{
TimeSpan mints = intime - bystart;
int minu = (int)mints.TotalMinutes;
if (minu >= stepTime)//超过步进时间
{
money += stepMoney;
}
//正常收费,每次循环增加标准步进时间间隔
intime = intime.AddMinutes(stepTime);
}
else//超过最小包夜时间,收取全部包夜费
{
money += nightMoney;
intime = intime.AddMinutes((int)(byend - intime).TotalMinutes);
}
}
}//while
}
}
else //包夜不隔天
{
}
textBox8.Text = money.ToString();
}
catch (Exception ex)
{
throw ex;
}
}
[
本帖最后由 redcar 于 2009-9-9 11:14 编辑 ]