PDA

Volledige versie bekijken : Afronden op 2 decimale achter de koma...


Sethar
%Europe/Berlin %634 %2006, 16:13
Hallo,

Ik ben vrij nieuwe met action scripts. Nu ben ik bezig om een soort van calculator te maken.
Dit is voor mensen die de prijs willen uitrekenen die ze moeten betalen.

Ik heb het zover werkent dat je alles kunt invullen en dat hij ook alles goed uitrekent.
Nou wil de persoon waarvoor ik deze 'calculator' heb gemaakt graag hebben dat de bedragen die uigerekent worden altijd 2 decimale achter de koma hebben. Maar dat krijg ik niet echt voor elkaar. Ik kan wel afronde (ceil of floor) maar weet niet hoe ik er decimale achter zet (in vele gevalen moeten er twee nulle bij.)

Ik heb een klein scriptje gevonden (hier op dit forum) maar als ik dat gebruik dan krijg ik toch steeds maar 1 of geen decimale achter de koma te zien.


function flourDecimals(number:Number, decimals:Number, t:String):Number
{
var k:Number = Math.pow(10,decimals);
number *= k;
number = Math[t](number);
number /= k;
return number;
}
trace(flourDecimals(10.11111, 2, "floor"));
trace(flourDecimals(10.145, 1, "ceil"));
trace(flourDecimals(10.78451, 3, "round"));


Dat is het script wat ik gevonden heb.
Om te kijken of het werk met mijn 'calculator' vervang ik de getalle (10,.....) door één variable die ik gebruik. Hier is de code die ik gebruik.


on(release){
if(dans<=0){
dans=1
}
if(dans>=6){
dans = 6;
}
if(td<=0){
td=0
}
if(ta<=0){
ta=0
}
dans = Math.ceil(dans)
ta = Math.ceil(ta)
td = Math.ceil(td)
dans_totaal = Math.ceil(dans) * 2.50;
deelnemers = 1;
deelnemers_totaal = 10;
td_totaal = Math.ceil(td) * 10;
ta_totaal = Math.ceil(ta) * 5;
totaal = deelnemers_totaal + dans_totaal + td_totaal + ta_totaal;
}


De code hangt vast aan een button die je dus eerst moet indrukken (release) om de code te activere.

Het 'calculatortje' berekent 4 dingen. Deelnemers (waarvan in deze versie er altijd maar 1 is), Dans (minimaal 1 en maximaal 6), td *toeschouwerskaarten dag+avond* (zoveel als je wilt) en ta *toeschouwerskaarten avond* (net zoals td).

Ook heb ik ervoor gezorgt dat 'td' en 'ta' niet lager dan 0 kunnen en mocht dat toch het geval zijn dat hij dan 0 invult en dus 0 gebruikt.


Nogmaals, de calculator werkt prima (heb geen problemen/bugs) alleen wil nu dat hij voor de uitrekeningen ('totaal', 'deelnemers_totaal', 'dans_totaal', 'td_totaal' en 'ta_totaal') altijd 2 decimalen (weergeeft) heeft... dus mocht de totaal uitkomen op € 12.5 dat hij dan € 12.50 laat zien en als het € 15 is dat hij € 15.00 laat zien. (bij alle totaal's zie iets hoger)

Hoop dat jullie begrijpen wat ik bedoel en dat het mogelijk is.

FredHeusschen
%Europe/Berlin %377 %2006, 10:04
totaal = "12"; // deze regel kun je dus weghalen, is maar als voorbeeld

cash = newArray;
cash = totaal.split(".");
if (cash.length == 1) {
totaal += ".00";
} else if (cash[cash.length - 1].length == 1) {
totaal += "0";
}
trace(totaal);


dit onderaan het al bestaande script zetten en het zou moeten werken...
Al komt er ongetwijveld over 10 seconde iemand die een kortere code post...

FredHeusschen
%Europe/Berlin %509 %2006, 13:13
heb mn post net even aangepast, heb m iets korter weten te maken :)

Sethar
%Europe/Berlin %578 %2006, 14:52
Zodra ik het script in de keyframe action plaats werkt hij wel... (alleen de trace)
En dan moet het cijfer van de var. totaal tussen "" staan.

Alleen dan werkt het de eerste keer, zodra ik de berekening maak dan werkt het niet.
Dit omdat de getallen bijelkaar opgeteld worde en vermenigvuldigt en de getallen niet tussen "" staan.

Het script werkt dus prima maar heeft niet het resultaat wat ik wil.
Ik zou dus graag willen dat er altijd 2 decimale achter de komma staan (punt in dit geval)

In de keyframe action staat:

totaal = 1;
deelnemers = 1;
deelnemers_totaal = 10;


In het gehele flash bestand staat noooit geen waarde of hoe je het moet noemen (cijfer wat je invoert en wat berekent word) tussen "". Hoop dat iemand mischien een andere oplossing heeft.
---------------------------------------
heb net zelf even zitten kijken.
heb het input field met de var totaal, etotaal genoemt en een var totaal toegevoegt met een action script.

vervolgens heb ik in de button zijn action script dit toegevoegt:

if(totaal == .5){
etotaal = totaal + "0"
}
else {
etotaal = totaal + ".00"
}

het else gedeelte werkt gewoon maar nu moet ik nog hebben als de waarde van totaal .5 bevat dat hij er dan "0" bijvoegt. weet iemand hoe dat moet ?

FredHeusschen
%Europe/Berlin %595 %2006, 15:17
ik kan je even niet helemaal volgen maar misschien heb je iets aan t volgende:

uitkomst= String(totaal);

cash = newArray;
cash = uitkomst.split(".");
if (cash.length == 1) {
uitkomst += ".00";
} else if (cash[cash.length - 1].length == 1) {
uitkomst += "0";
}
trace(uitkomst);


heb een soort van tijdelijke variabel (uitkomst) aangemaakt die eerst de waarde van "totaal" omzet naar een string (dus tussen ""). Ook blijft de waarde van "totaal" zo hetzelfde waardoor je er later mee kunt verderrekenen.

Succes dr mee

Sethar
%Europe/Berlin %634 %2006, 16:14
Erg bedankt deze werkt prima :D
Dit is hoe de code er nu uitziet:


deelnemers_uitkomst= String(deelnemers_totaal)
deelnemerscash = newArray;
deelnemerscash = deelnemers_uitkomst.split(".");
if (deelnemerscash.length == 1) {
deelnemers_uitkomst += ".00";
} else if (deelnemerscash[deelnemerscash.length - 1].length == 1) {
deelnemers_uitkomst += "0";
}
dans_uitkomst= String(dans_totaal)
danscash = newArray;
danscash = dans_uitkomst.split(".");
if (danscash.length == 1) {
dans_uitkomst += ".00";
} else if (danscash[danscash.length - 1].length == 1) {
dans_uitkomst += "0";
}
td_uitkomst= String(td_totaal)
tdcash = newArray;
tdcash = td_uitkomst.split(".");
if (tdcash.length == 1) {
td_uitkomst += ".00";
} else if (tdcash[tdcash.length - 1].length == 1) {
td_uitkomst += "0";
}
ta_uitkomst= String(ta_totaal)
tacash = newArray;
tacash = ta_uitkomst.split(".");
if (tacash.length == 1) {
ta_uitkomst += ".00";
} else if (tacash[tdcash.length - 1].length == 1) {
ta_uitkomst += "0";
}
uitkomst= String(totaal);
cash = newArray;
cash = uitkomst.split(".");
if (cash.length == 1) {
uitkomst += ".00";
} else if (cash[cash.length - 1].length == 1) {
uitkomst += "0";
}


Het is vrij lang, wat mij niet echt uitmaakt. Mocht het compacter kunnen zou je het dan kunnen posten hoe ? want ik zie niet echt hoe.

Nogmaals bedankt voor je hulp, heeft echt erg geholpen :D de calculator werkt nu prima 8D
Prijzen hebben altijd 2 decimalen erachter staan. :)

FredHeusschen
%Europe/Berlin %673 %2006, 17:10
zal er eens naar kijken alsk meer tijd heb.
p.s. gebruik [ as ] ipv [ code ] om actiescript een beetje leesbaar te houden :)

victorious_e
%Europe/Berlin %675 %2006, 17:12
ik heb een vraag die hier wel bij aansluit..
ik laad een variabele in vanuit een extern bestand..
deze variabele is een getal met 1 decimaal achter de comma.
nu wil ik bij dit getal een ander getal optellen.. het wordt dus iets als dit:

_parent.container1["bestand"+f]._x = this["xpos"+f]+500;


stel dat de xpos 2000,0 is, dan geeftie 2000,0500 in plaats van 2500,0..
hoe werkt dit?

gr victor

Dauntless
%Europe/Berlin %693 %2006, 17:38
Ik heb even die functie uit je 1ste post getest en hij werkt perfect hier.
Mijn output window laat zien:
10.11
10.2
10.785

dinkstar
%Europe/Berlin %721 %2006, 18:18
wwerkt idd perfect hier ook :)

Dauntless
%Europe/Berlin %731 %2006, 18:33
(Lol, ik heb die functie zelf geschreven :D hier (http://flashfocus.nl/forum/showthread.php?t=12927&highlight=afronden))

Gerrit55
%Europe/Berlin %314 %2006, 08:32
Dauntles, jouw code werkt wel , maar laat geen bv. geen 2 decimalen achter de komma zien, als je traced:
trace(flourDecimals(10,2, "floor"))
krijg je als uitkomst: 10 en niet 10.00

In het grijze verleden heb ik nog eens een prototype gepost in het ASD (ja vroeger gebeurde daar nog wel eens wat)
http://www.flashfocus.nl/forum/showthread.php?t=289
Het is wel voor Flash MX maar is waarschijnlijk zo aan te passen voor Flash 8

Emveedee
%Europe/Berlin %500 %2006, 13:00
Bestaat er eigenlijk niet zoiets als

Math.round(10.92394 , 2);

ofzo?

Dauntless
%Europe/Berlin %533 %2006, 13:47
Nope.

FredHeusschen
%Europe/Berlin %373 %2006, 09:57
Sethar (even back 2 basic), heb de code even ingekort...

deelnemers_totaal = "12"; // deze 5 regels kunnen dus weg, ze dienen slechts als voorbeeld
dans_totaal = "9.1";
td_totaal = "8.3";
ta_totaal = "230";
t_totaal = "6.00"; // bij "totaal" moet voor deze functie iets voor komen te staan, heb er even "t" voor gezet

lijst = "deelnemers, dans, td, ta, t"; // hier maak je een lijst van alle variabelen,
// afgescheiden door ", " (komma spatie)


lA = new Array();
lA = lijst.split(", "); // de lijst opsplitsen aan de hand van ", " (komma spatie)

function decimalenCheck() { // de functie
uitkomst = String( this[ lA[nr] + "_totaal"] ); // uitkomst = deelnemers + "_totaal"
getal = new Array();
getal = uitkomst.split("."); // uitkomst opsplitsen aan de hand van "."
if (getal.length == 1) { // als de lengte 1 is (geen ".")
uitkomst += ".00"; // dan ".00" toevoegen
} else if (getal[getal.length - 1].length == 1) { // anders als de lengte van wat na de punt komt 1 is "12345.0"
uitkomst += "0"; // dan "0" toevoegen
}
this[ lA[nr] + "_uitkomst"] = uitkomst; // uitkomst toekennen aan de variable

trace(this[ lA[nr] + "_uitkomst"]); // de waarden komen er netjes met 2 decimalen uitrollen
}

button.onRelease = function() { // deze actie kan ook aan de knop zelf zitten
for (nr=0; nr<lA.length; nr++) { // for, gaat zo alle waarden uit de "lijst" af
decimalenCheck(); // de functie decimalen uitvoeren
}
}


p.s. de 'totaal' moet je even vervangen voor 't_totaal' of iets anders waar '_totaal' achter gezet kan worden...

FredHeusschen
%Europe/Berlin %585 %2006, 15:03
Bestaat er eigenlijk niet zoiets als

Math.round(10.92394 , 2);

ofzo?
je kunt natuurlijk wel doen:

getal = Math.round(10.92394 * 100)/100;

Dan krijg je wel 10.92 voor 'getal'
Alleen zal bijvoorbeeld 10.90 niet lukken, dat wordt dan 10.9