[jQuery] Calculation Plugin avarage met lege velden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TheCrius
  • Registratie: Mei 2008
  • Laatst online: 14-09 21:22
Beste medetweakers,

ik ben bezig met een formulier welke bestaat uit meerdere select fields. Deze selectfield bevatten een percentage welke ik onchange in een jQuery progressbar weergeef. Op wijziging wordt deze progressie weergegeven. Om het gemiddelde te berekenen gebruik ik de calculation plugin (zie: http://www.pengoworks.com...on/calculation.plugin.htm). Deze heb ik enigszins aangepast zodat deze ook te gebruiken is met selectfields.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    $(document).ready(
        function (){
        
            $("select[id^=calced]").avg({
        
                bind:"change"
, onParseClear: null
                , oncalc: function (value, settings){
                     $("#pb1").progressBar(value);
                }
                
            });
            
        }
        
    );


In een while loop maak ik verschillende selects aan.
code:
1
2
3
4
5
6
7
8
<select name="avg<?php echo $data['fieldnr'];?>" id="calced" class="gradeselection">
                        <option value="0">0%</option>
                        <option value="25">25%</option>
                        <option value="50">50%</option>
                        <option value="75">75%</option>
                        <option value="100">100%</option>
                        <option value="">N.v.t.</option>
</select>


Op zich gaat het tot dusver prima, ik kan 20 velden aanmaken en hier krijg ik netjes het gemiddelde van. Als ik N.v.t. op 100% zet komt de berekening natuurlijk niet uit. Als ik het veld leeg maak, wordt deze als "0" geteld, maar niet overgeslagen. Ik heb geprobeerd om de check om te bouwen die in het javascript zit maar dan loopt de berekening vast.

code:
1
2
3
4
// if the value is null, use 0
                //if( v == ''){
                    //v = 0; // update value
}

Heeft iemand tips hoe ik dit zou kunnen doen? De plugincode die ik gebruik is 0.4.09 revisie 13 (http://www.pengoworks.com...ion/jquery.calculation.js)

[ Voor 3% gewijzigd door TheCrius op 12-10-2011 14:19 ]

Falling down is how we grow. Staying down is how we die. --Brian Vaszily


Acties:
  • 0 Henk 'm!

  • ray538
  • Registratie: Januari 2010
  • Laatst online: 10:00
Wat wil je precies bereiken? Moet een veld met waarde 0 niet meegeteld worden?
Probeer even een concrete vraag te formuleren.

Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

TheCrius schreef op woensdag 12 oktober 2011 @ 14:18:
Ik heb geprobeerd om de check om te bouwen die in het javascript zit maar dan loopt de berekening vast.
Wat bedoel je met loopt vast? Doordat je geen waardes oplevert deel je door 0?

JavaScript:
1
2
3
return math.sum(a)/a.length;

return a.length > 0 ? (math.sum(a)/a.length) : 0;

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

  • TheCrius
  • Registratie: Mei 2008
  • Laatst online: 14-09 21:22
ray538 schreef op woensdag 12 oktober 2011 @ 20:09:
Wat wil je precies bereiken? Moet een veld met waarde 0 niet meegeteld worden?
Probeer even een concrete vraag te formuleren.
Een veld met de waarde nul zou meegedeeld moet worden, maar een lege waarde moet worden overgeslagen bij het berekenen van het gemiddelde. Als ik dus een selectveld op een lege waarde zet (of iets anders, wat maar mogelijk is), wil ik graag dat deze niet wordt meegenomen in de score .Zou ik 10 select velden aanmaken en op 100% zetten en zou ik 1 daarvan op NVT zetten, dan zou dit veld niet meegerekend moeten worden. Dus dan zou het gemiddelde berekend moeten worden over 9 velden van 100%. Dus,

Select 1 : 20%
Select 2: 0%
Select 3: ""
_______________
(select 1 + select 2 ) / 2


Maar als het veld wel een geldige waarde bevat tussen 0/100 moet het wel worden meegenomen.
eek schreef op woensdag 12 oktober 2011 @ 22:22:
[...]


Wat bedoel je met loopt vast? Doordat je geen waardes oplevert deel je door 0?
Ik denk dat het inderdaad komt doordat er een lege waarde door nul wordt gedeeld.
Je code komt in de buurt maar ik denk dat dit me werkelijke probleem niet oplost. Aangezien een leeg veld met nul wordt vervangen.

Dit is nu het geval:

Select 1 : 20%
Select 2: 0%
Select 3: "" (0%)
_______________
(select 1 + select 2 + select3 ) / 3

Wat volgens mij zou moeten, is dat een leeg vak niet mee zou moeten worden genomen in de berekening.

[ Voor 36% gewijzigd door TheCrius op 13-10-2011 09:24 ]

Falling down is how we grow. Staying down is how we die. --Brian Vaszily


Acties:
  • 0 Henk 'm!

  • ray538
  • Registratie: Januari 2010
  • Laatst online: 10:00
Ik heb met niet verdiept in die plugin, vind het vrij veel regels code om het gemiddelde te berekenen. Ik zou het als volgt doen:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
$('.avg').change(function(){
    var total = 0;
    var counter = 0;
    $('.avg').each(function(i){
        if($(this).val() != 'NULL'){
            total += parseInt($(this).val());
            counter += 1;
        }
    });
    var result = (counter != 0) ? Math.round(total/counter)+'%' : 'Geen antwoord';
    $('#result').text(result);  
});

Een werkend voorbeeldje staat hier: http://jsfiddle.net/j4tUb/

Korte uitleg, zodat je begrijpt wat er gebeurd (het stelt niet zo veel voor):
Zodra er een select word gewijzigd loopt hij door alle selects heen. Bij iedere select controleer hij of de waarde niet leeg is (heb ik voor het gemak NULL genoemd). Als dat zo is voegt hij de waarde toe aan het totaal en hoogt hij de teller met één op. Aan het eind word het gemiddelde berekent (totaal / aantal), mits aantal niet nul is (delen door nul kan niet). Het resultaat word in een simpele span getoond.

Acties:
  • 0 Henk 'm!

  • TheCrius
  • Registratie: Mei 2008
  • Laatst online: 14-09 21:22
Bedankt Ray wat een heldendaad, het werkt en nog een stuk eenvoudiger dan met de plugin. Heb de code nog enigszins aangepast, maar snapte het in ieder geval omdat je de uitleg er bij zette. Top.

Falling down is how we grow. Staying down is how we die. --Brian Vaszily

Pagina: 1