I en applikation som jag gör för jobbet så har jag fastnat i en if-sats, där jag skall ta fram rester Okunskap. Jag tror att du tänkt lite fel i dina if-satser. Jo tror nog att jag har snärjt in mig här, Jag är inte riktigt med på förväntad funktion. Vilket värde har full, vilket returvärde förväntar du dig och vilket får du? Jag har nog varit lite otydlig. Detta handlar om tidsrapportering. Det är nog flera fel. Först så tycker jag att du ska debugga programmet (läs variablernas värden efter varje operation, så ser du var det går fel). Nu tror jag att jag har fått till det, och jag hoppas att ni vill kika lite på koden, den verkar att fungeraIf-sats problem
beroende på arbetstid.
<code>
if (start == "07:00" && slut == "15:45")
rast =Convert.ToDecimal("0,45");
else if (start == "07:00" && slut == "11:45")
rast = Convert.ToDecimal("0,15");
else if (start == "07:00" && slut == "14:00")
rast = Convert.ToDecimal("0,45");
else if (start == "07:00" && slut == "11:15")
rast = Convert.ToDecimal("0,15");
</code>
start och slut är sting. Mitt problem är att jag skulle vilja ha med
<code>
if (start == "07:00" && slut >= "15:45")
</code>
..men då blir det fel.
Jag har försökt med andra datatyper, decimal datetime, men jag får inte till det.
Jag vore väldigt tacksam om någon ville hjälpa mig här.
Om jag gör så här:
<code>
if(full >=8)
rast = Convert.ToDecimal("0,45");
else if (full >=7 && full < 8)
rast = Convert.ToDecimal("0,45");
else if (full <= 5 && full < 4)
rast = Convert.ToDecimal("0,15");
else if (full <= 4 && full < 3)
rast = Convert.ToDecimal("0,15");
else
rast = Convert.ToDecimal("0");
return dTotal - rast;
</code>
if vi då säger att full = 4 så visar sig resultatet som 415. Inte ett tätt alls ???Sv: If-sats problem
Finns det inte Select Case i C#
Ditt problem är ett typiskt exempel på där Select Case är helt perfekt.
Se gärna på gamla program Skeppsklocka och porta till C#
Programarkivet:Skeppsklocka TidvaktSv: If-sats problem
else if (full <= 4 && full < 3)
Betyder "Om full är mindre än eller lika med 4 samt även mindre än 3 så". I praktiken mindre än 3 alltså. Gissar du vänt "gapet" och egentligen vill ha:
else if (full <= 4 && full > 3)
Eftersom du kommer in i else-satsen så blir rast=0 i ditt exempel.
En annan sak, du bör inte konvertera sträng till decimal "i onödan", risk för problem vid andra nationella inställningar. Istället för:
rast = Convert.ToDecimal("0,15");
bör du göra såhär:
rast = 0.15;
JohanSv:If-sats problem
<code>
decimal dTotal = full;
decimal rast = 0;
if(full >=8)
rast = 0.45M;
else if (full >=7 && full < 8)
rast = 0.45M;
else if (full >= 6 && full < 7)
rast = 0.45M;
else if (full >= 5 && full < 6)
rast = 0.15M;
else if (full >= 4 && full < 5)
rast = 0.15M;
else if (full >= 3 && full < 4)
rast = 0.15M;
else
rast = 0;
return dTotal - rast;
</code>
Om jag har en person vars ordenarie arbetstid är 07:00-11:15.
Om han nu slutar 12:15 eller 13:15 då fungerar det, men slutar han 12:45 då minskars inte timmarna
med rasten de lägs ihop. Konstigt?Sv: If-sats problem
JohanSv:If-sats problem
Jag tar fram normaltiderna till en gridview där det framgår vilka tider som man har kommit överens om t ex 07:00 - 11:15 , det finns flera konstiga tider. Vad jag då skall räkna ut är den korrekta arbetstiden
- rast.
Jag börjar så här:
<code>
sArbetsTid = objDR["arbetstid"].ToString();//detta är tiden hämtat ifrån databasen och sparat i string("07:00-11:15").
//följande styke är jag väldigt osäker på, jag tror att jag har gjort rätt.
char[] separator = { '-' };
string[] sBaTid = sArbetsTid.Split(separator);
startTid = DateTime.ParseExact(sBaTid[0].Replace(":", "."), TimeFormat, CultureInfo.InvariantCulture);
sluttTid = DateTime.ParseExact(sBaTid[1].Replace(":", "."), TimeFormat, CultureInfo.InvariantCulture);
tsDiff = sluttTid.Subtract(startTid);
DateTime d = new DateTime(tsDiff.Ticks);
string tidsSkillnad = d.ToString("HH:mm");
DateTime dD = Convert.ToDateTime(tidsSkillnad);
string sTemp = dD.ToShortTimeString().Replace(":", ",");
sFullTid = Convert.ToDecimal(sTemp);
sFullTid = Webbutill.countRast(startTid.ToShortTimeString(), sluttTid.ToShortTimeString(), sFullTid);
</code>
Detta går sedan till classen ovan.
Kan felet ligga inbyggt här?Sv: If-sats problem
Vad jag kan se så är grundproblemet att du hanterar minuter som hundradels timmar (när det är 60-dels timmar). T.ex. är inte 15 minuter=0.15 timmar utan 0.25 timmar. Tänk igenom det så kommer du hitta flera fel i din kod.
JohanSv:If-sats problem
bra.
<code>
protected void Button1_Click(object sender, EventArgs e)
{
DateTime startTid;
DateTime sluttTid;
DateTime total;
startTid = Convert.ToDateTime(TextBox1.Text);
sluttTid = Convert.ToDateTime(TextBox2.Text);
TimeSpan tsDiff = sluttTid - startTid;
total =countRast(Convert.ToDateTime(tsDiff.ToString()));
lResult.Text = total.ToShortTimeString();
}
public static DateTime countRast(DateTime totalTid)
{
DateTime rast = Convert.ToDateTime("0:00");
TimeSpan tsDiff = totalTid - rast;
if (totalTid >=Convert.ToDateTime("6:00"))
{
rast = Convert.ToDateTime("0:45");
tsDiff = totalTid - rast;
}
else if (totalTid >= Convert.ToDateTime("3:00") && totalTid < Convert.ToDateTime("6:00"))
{
rast = Convert.ToDateTime("0:15");
tsDiff = totalTid - rast;
}
totalTid = Convert.ToDateTime(tsDiff.ToString());
return totalTid;
}
</code>
Jag gjorde en ny sida enbart för att kolla.