Hej, Nu har gjort en lösing som troligen är ganska ful.....? Utan att ha gjort några närmare studier av koden har jag en snabb uppsnyggning; Och om du kan tänka dig att byta lite namn så kan du även parametrisera lite:Uträkning
Nu har jag suttit i MÅNGA timmar och försökt skriva ett script som gör några uträkningar, men det går inte.
Jag är för dålig helt enkelt...
Så, är det någon som känner för att hjälpa mig att skriva följande script?
Först har jag två textboxar:
txtUnitPrice, får vara decimaltal och får vara tomt. Får ej vara negativt
txtAmount, får bara vara HELTAL och får vara tomt. Får ej vara negativt
Dessa två skall multipliceras och visas i en textbox, txtSum(som är ReadOnly)
------------------------------------------------------------------------------
Sen har jag på rad två likandant:
txtNextUnitPrice, får vara decimaltal och får vara tomt. Får ej vara negativt
txtNextAmount, får bara vara HELTAL och får vara tomt. Får ej vara negativt
Dessa två skall multipliceras och visas i en textbox, txtNextSum(som är ReadOnly)
Här kan txtNextSum redan ha ett värde när sidan laddas(från databasen), så den summan skall ju inte ändras förrän båda textboxarna före är ifyllda.(om dom fylls i, det är frivilligt)
Resultatet av txtSum + txtNextSum skall visas i en sista textbox, txtTotalSum(som är ReadOnly)
Denna uträkning skall ju göras "on the fly", vid onblur, eller vad man nu kan tänkas använda? Man skall alltså inte klicka på någon knapp, utan när du t ex lämnar ett textfält görs hela uträkningen.
Någon som har lust/ork att hjälpa mig?
/JockeSv: Uträkning
Det funkar som jag vill att det ska göra, men det känns inte så riktigt ändå...
Någon av er kanske ser hur man kan snygga upp denna kod något?
Som ni ser anropar jag två nästan identiska funktioner beroende på om jag ska validera heltal eller decimaltal. På texboxarna har jag lagt onBlur="return CalcAndVerifyOnlyFloat(txtBoxId);", alt. onBlur="return CalcAndVerifyOnlyInteger(txtBoxId);"
Det borde ju gå att göra mycket snyggare?
Textboxarna heter lite annat här än vad jag skrev ovan:
txtQuantity(är intger) * txtUnitPrice(är float) = txtPhoneCosts (float)
txtCartonQuantity(är integer) * txtCartonUnitPrice(är float) = txtPackagingCosts (float)
txtPhoneCosts + txtPackagingCosts = txtTotalCosts
<code>
<script language="javascript">
function CalcAndVerifyOnlyFloat(field)
{
newValue = field.value.replace(",",".");
field.value = newValue;
if(isNaN(newValue) || newValue < 0)
{
alert("Must be a numeric value!");
field.focus();
field.select();
return false;
}
else
{
CalcPhoneCosts();
CalcCartonCosts();
CalcTotalCost();
return true;
}
}
function CalcAndVerifyOnlyInteger(field)
{
newValue2 = field.value.replace(",",".");
field.value = newValue2;
if(newValue2.length > 0)
{
if(parseInt(newValue2)!=newValue2-0 || newValue2 < 0)
{
alert("Must be a numeric value, no decimals or letters!");
field.focus();
field.select();
return false;
}
else
{
CalcPhoneCosts();
CalcCartonCosts();
CalcTotalCost();
return true;
}
}
else
{
CalcPhoneCosts();
CalcCartonCosts();
CalcTotalCost();
return true;
}
}
function CalcPhoneCosts()
{
Quantity = document.getElementById("<%=txtQuantity.ClientID%>").value;
UnitPrice = document.getElementById("<%=txtUnitPrice.ClientID%>").value;
var total = UnitPrice * Quantity;
document.getElementById("<%=txtPhoneCosts.ClientID%>").value = total;
}
function CalcCartonCosts()
{
Quantity = document.getElementById("<%=txtCartonQuantity.ClientID%>").value;
UnitPrice = document.getElementById("<%=txtCartonUnitPrice.ClientID%>").value;
if(Quantity.length > 0 && UnitPrice.length > 0 && parseInt(Quantity) >= 0 && parseFloat(UnitPrice) >= 0)
{
var total = UnitPrice * Quantity;
document.getElementById("<%=txtPackagingCosts.ClientID%>").value = total;
}
}
function CalcTotalCost()
{
totPhoneCosts = parseFloat(document.getElementById("<%=txtPhoneCosts.ClientID%>").value);
totCartonCosts = parseFloat(document.getElementById("<%=txtPackagingCosts.ClientID%>").value);
totalCosts = totPhoneCosts+totCartonCosts;
document.getElementById("<%=txtTotalCosts.ClientID%>").value = Math.round(totalCosts*100)/100;
}
</script>
</code>Sv:Uträkning
function CalcCosts(){
CalcPhoneCosts();
CalcCartonCosts();
CalcTotalCost();
}
För att få bort en del upprepning.
Och slå ihop de två if-satserna till
if(newValue2.length > 0 && parseInt(newValue2)!=newValue2-0 || newValue2 < 0)
(javascript har väl short-circuiting?)Sv:Uträkning
function CalcCost(type)
{
Quantity = document.getElementById("<%=txt" + type + "Quantity.ClientID%>").value;
UnitPrice = document.getElementById("<%=txt" + type + "UnitPrice.ClientID%>").value;
if(Quantity.length > 0 && UnitPrice.length > 0 && parseInt(Quantity) >= 0 && parseFloat(UnitPrice) >= 0) {
var total = UnitPrice * Quantity;
document.getElementById("<%=txt" + type + "Costs.ClientID%>").value = total;
}
}
function CalcPhoneCosts()
{
CalcCost("Phone");
}
function CalcCartonCosts()
{
CalcCost("Carton");
}
Genom att parametrisera på float eller int (en parameter "isFloat", typ), kan du även fixa båda de funktionerna, och sen skriva:
var ok;
if(isFloat)
ok = isNan(...) ...;
else
ok = ...;
if (ok){
alert(...)
...
}
else {
...
}